MongoDB設計方法及技巧

MongoDB是一種流行的數據庫,可以在不受任何錶格schema模式的約束下工作。數據以類似JSON的格式存儲,並且可以包含不同類型的數據結構。例如,在同一集合collection 中,我們可以擁有以下兩個文檔document:

{
    id: '4',
    name: 'Mark',
    age: '21',
    addresses : [
        { street: '123 Church St', city: 'Miami', cc: 'USA' },
        { street: '123 Mary Av', city: 'Los Angeles', cc: 'USA' }
    ]
}

{
    id: '15',
    name: 'Robin',
    department: 'New Business',
    example: 'robin@example.com'
}

為了能夠充分利用MongoDB的優勢,您必須了解並遵循一些基本的數據庫設計原則。在講解設計方法之前,我們必須首先了解MongoDB存儲數據的結構。

一、 數據如何存儲在MongoDB中

與傳統的RDBMS關係型數據庫不同,MongoDB並沒有表Table,行row和列column的概念。它將數據存儲在集合collections,文檔documents和字段fields中。下圖說明了與RDBMS類比的結構之間的關係:

二、數據庫設計技巧和竅門

2.1.規範化存儲與非規範化存儲

因為MongoDB使用文檔來存儲數據,所以理解“規範化存儲“”和“非規範化存儲”的概念非常重要。

規範化存儲:-規範化意味着將數據存儲到多個集合collections中,並在它們之間設計關聯關係。數據保存之後,更新數據比較容易。但是在讀取數據的時候,規範化存儲的缺點就顯現出來。如果要從多個集合collections查找數據,則必須執行多個查詢,從而使讀取數據的速度變慢。 (比如:將網頁標題、作者、內容分別存儲到不同的collections中)

非規範化存儲:-這種方式將若干對象數據,以嵌套的方式存儲到單個文檔中。它在讀取數據的時候表現更好,但在寫入時會變慢。這種存儲數據的方式還將佔用更多空間。 (比如:將網頁標題、作者、內容分別存儲到同一個collection中)

所以在兩種存儲數據方式之間進行選擇之前,先評估一下你的應用數據庫的使用方式。

  • 如果您有一個不需要頻繁更新的數據,更新的即時一致性不是很重要,但是在讀取時需要良好的性能,那麼非規範化可能是明智的選擇。(比如:我們博客的博文,作者一旦保存之後,幾乎就不在進行頻繁的修改,但是面臨着讀者頻繁的讀取閱讀操作)

  • 如果數據庫中的文檔數據需要不斷的更新,並且您希望在寫入時具有良好的性能,那麼您可能需要考慮規範化存儲。(比如:需要頻繁修改數據的業務類系統)

2.2. 一對多關係

與RDBMS相比,在MongoDB中對“一對多”關係建模需要進行更細粒度的設計。許多初學者陷入將文檔數組嵌入父文檔中的陷阱。正如我們在上文中介紹的,知道何時進行規範化存儲或非規範化存儲是非常重要的。因此設計者需要考慮關係的基數是“一個對少數幾個”還是“一個對多個”?每種關係將具有不同的建模方法。

例如:下面“一個對少數幾個”的建模示例。最好的建模方法是在父文檔(persopn)中嵌入幾個(address):

> db.person.findOne()
{
  name: 'Mark Kornfield',
  ssn: '1223-234-75554',
  addresses : [
     { street: '123 Church St', city: 'Miami', cc: 'USA' },
     { street: '123 Mary Av', city: 'Los Angeles', cc: 'USA' }
  ]
}

在“一個對多個”示例中,我們將考慮設計兩個集合,即產品products集合和零件parts集合。每個零件都有一個“ ObjectID”,該“ ObjectID”將出現在產品集合的引用中。這樣的設計可以讓讀寫性能更高效。

> db.parts.findOne()
{
    _id : ObjectID('AAAA'),
    partno : '1224-dsdf-2215',
    name : 'bearing',
    price: 2.63

> db.products.findOne()
{
    name : 'car',
    manufacturer : 'Ford',
    catalog_number: 2234,
    parts : [     // array of references to Part documents
        ObjectID('AAAA'),    // reference to the bearing above
        ObjectID('F17C'),    // reference to a different Part
        ObjectID('D2AA'),
        // etc
]

2.3.設計模式可視化

儘管MongoDB是schemaless“無模式的”,但仍然存在將集合collections可視化為圖表的方法。能夠查看設計圖,將對您理解和設計MongoDB的方式上產生重大影響。

DbSchema是可以很好地完成可視化設計工作的一個工具。如下圖所示,它將通過讀取集合和文檔來推導架構。此外,您只需單擊就可以修改圖中的對象。在DbSchema中,您還可以為MongoDB創建外鍵,當然僅在本地創建,只用於設計目的。

2.4.智能索引

為了保持數據庫的良好性能,有必要建立智能索引,這將簡化寫入和讀取操作。知道MongoDB的索引優勢和局限性非常重要,MongoDB保留用於排序操作的內存限製為32MB。如果你不使用索引,則排序時數據庫將被迫將所有排序文檔hold在內存裏面,如果達到32M的限制,則數據庫將返回錯誤或空集。

結論

對MongoDB的透徹理解與對數據庫想要實現的目標的清晰了解是良好數據庫設計的秘訣。

歡迎關注我的博客,裏面有很多精品合集

  • 本文轉載註明出處(必須帶連接,不能只轉文字):字母哥博客。

覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! 。另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注。

  • 《手摸手教你學Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《實戰前後端分離RBAC權限管理系統》
  • 《實戰SpringCloud微服務從青銅到王者》
  • 《VUE深入淺出系列》

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

C# 9.0 新特性之只讀屬性和記錄

閱讀本文大概需要 2 分鐘。

大家好,這是 C# 9.0 新特性系列的第 4 篇文章。

熟悉函數式編程的童鞋一定對“只讀”這個詞不陌生。為了保證代碼塊自身的“純潔”,函數式編程是不能隨便“弄髒”外來事物(參數、變量等)的,所以“只讀”對函數式編程非常重要。

為了豐富 C# 對函數式編程支持,較新的 C# 版本引入了一些很有用的新特性。比如 C# 8 中就對 struct 類型的方法增加了 readonly 修飾符支持,被 readonly 修飾的方法是不能修改該方法所在類的屬性的。舉個例子:

public struct FooValue
{
    private int A { get; set; }
    public readonly int IncreaseA()
    {
        A = A + 1; // 報錯
        return A;
    }
}

而 C# 9 又進一步增加了對“只讀”的支持,此次增加了 init-only 屬性和 record 相關特性,下面一一介紹。

Init-only 屬性

我們知道類的屬性有 set 和 get 兩種訪問器,現在 C# 9 增加一種屬性訪問器:init。init 是 set 訪問器的變體,它的作用是使屬性只能在對象初始化的時候對其賦值,之後該屬性就是只讀的,因此叫 init-only 屬性。使用方式如下:

public class Foo
{
    public string PropA { get; init; }
    public string PropB { get; init; }
}

賦值操作:

var foo = new Foo {  PropA = "A", PropB = "B" };
foo.PropA = "AA"; // 報錯,PropA 此時是只讀的!

由於 init 是在初始化階段賦值,所以它可以在類內部修改 readonly 修飾的字段。比如:

public class Foo
{
    private readonly string propA;
    private readonly string propB;

    public string PropA
    {
        get => propA;
        init => propA = (value ?? throw new ArgumentNullException(nameof(propA)));
    }
    public string PropA
    {
        get => propB;
        init => propB = (value ?? throw new ArgumentNullException(nameof(propB)));
    }
}

如果你知道在構造函數中可以對只讀字段/屬性賦值就自然也理解這一點。

記錄 (Record)

做過財務系統的人都知道交易記錄一旦入賬是不能修改的,如果錄入錯誤,就要新錄入一筆負的記錄把之前的紅衝掉,再錄入正確的記錄。應對類似這種只讀記錄的場景,C# 9 引入了 Record(記錄,下文均使用中文的“記錄”)的概念,它用來支持整個對象的只讀特性(即實例化後為只讀)。使用方式如下:

public data class Foo
{
    public string PropA { get; init; }
    public string PropB { get; init; }
}

這裏用了一個 data 關鍵字,表示該類的對象只是純粹的記錄值,它不是可修改的狀態(在函數式編程中,所有的數據修改都是狀態在發生變化)。

上面的太麻煩了,可以這樣簡寫:

public data class Foo
{
    string PropA;
    string PropB;
}

默認屬性都是 public 的,如果實在要改為 private,可以在屬性定義前面加上 private 修飾符。

定位記錄 (Positional Record)

有時候為了初始化更方便,可以定義構造函數來給屬性賦值,初始化時只需要把屬性值按順序傳給構造函數即可,這個操作稱為定位構造(Positional Construction)。同樣,也可以使用解構函數(Deconstructor)來實現屬性的解構,即按照解構函數的參數順序從對象中提取屬性的值,被稱為定位解構(Positional Deconstructor)。實現了定位構造或定位解構的記錄稱為定位記錄(Positional Record)。下面是一個定位記錄的實現:

public data class Foo
{
    string PropA;
    string PropB;
    public Foo(string propA, string propB)
      => (PropA, PropB) = (propA, propB);
    public void Deconstruct(out string propA, out string propB)
      =>  (propA, propB) = (PropA, PropB);
}

這個寫法太麻煩了,可以直接簡寫為:

public data class Foo(string PropA, string PropB);

這樣簡短一句代碼,其內部默認實現了 init-only 自動屬性,且同時為所有屬性定義了構造函數和解構函數。

使用示例:

var foo = new Foo("AA", "BB");  // 構造定位
var (a, b) = foo;               // 解構定位

可以想象,記錄的大部分使用場景,以上簡寫的寫法能滿足需求。若有特殊場景,就不能簡單,需要進行自定義修改其默認行為。

with 表達式

當處理不可變數據時,若要生成不同的狀態,一個常見的場景是在一條舊記錄基礎上拷貝一條新的記錄。比如我們要修改 Foo 對象的 PropA 屬性,我們就要拷貝該對象生成一個新的對象。這個操作在函數式編程中被稱為“非破壞性修改 (non-destructive mutation)”。為了支持記錄這個操作,C# 9 引入了 with 表達式,它可以很方便在一條原有記錄基礎上創建一條新記錄。示例:

var other = foo with { PropA = "AA" };

with 表達式內部其實是通過一個默認的 protected 構造函數來實現的,大致如下:

protected Foo(Foo original)
{
    // 拷貝 original 的所有字段
}

如果默認實現的字段拷貝不符合你的需求,你也可以手動實現這個構造函數。

今天就分享到這裏,敬請期待一下篇關於 C# 9 新特性的文章!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

新屋區西濱快速公路旁一處1000餘坪的農地

新屋區西濱快速公路旁一處1000餘坪的農地,傳出有環保業者準備變更用地設置資源回收場,地方憂心污染影響生活品質,永安里、永興裡民6日集結100多人在回收場用地旁搭棚抗議,呼籲市府切勿「助紂為虐」,否則將埋鍋造飯、抗爭到底。

市府環保局表示,業者申請興辦資源回收場,專營暫置廢紙、廢鐵與寶特瓶等公告應回收物,細分類後再送至終端作業廠,僅有物理性作業,未涉及廢料再製,這與民眾認知的廢棄物處理場有所不同。業者6日上午曾到場與環保局人員見面,面對記者詢問、居民喊話均無回應,僅表示一切會依照程序處理。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※哪裡買的到省力省空間,方便攜帶的購物推車?

※廢氣洗滌塔,叫得動, 找得到的專業廠商‎

※市面十大品牌封口機!該如何選購?

※塑膠射出成型加工商品有哪些?

※選用哪種桶裝水,外宿露營超方便?

※各款電動堆高機價格?

※掌握產品行銷策略,帶你認識商品包裝設計基本要素

土耳其和賽普勒斯共和國爭奪東地中海天然資源而緊張升溫

土耳其和賽普勒斯共和國爭奪東地中海天然資源而緊張升溫。土耳其能源部長唐梅茲7日宣布,第2艘鑽井船「兇猛號」已開始作業,且很快會派另一艘地質考船前往當地海域。「截至今天,我們鑽井深度達1710公尺,我們在這裡會進行2個半到3個月的計畫。」唐梅茲希望在鑽探達目標深度後能夠發現天然氣。

安納杜魯新聞社(Anadolu Agency)報導,安卡拉自今春以來派遣「征服者號」(Fatih)和「兇猛號」兩艘鑽井船在東地中海探勘油氣資源,藉以主張土耳其和北賽普勒斯土耳其共和國(北賽)對相關海域的資源擁有權利,卻也因此與賽普勒斯共和國(南賽)陷入爭端。

希臘和南賽政府持續反對土耳其在東地中海的活動,並且對船員發出逮捕令,此舉獲歐盟領導人支持,加入譴責安卡拉行動的行列。

土耳其「 自由日報」(Hurriyet Daily News)報導,南賽總統阿納斯塔西亞迪斯(Nicos Anastasiades)與北賽領袖阿欽席(Mustafa Akinci)9日將就如何突破已陷入僵局達兩年的和平談判進行會商。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※無塵擦拭紙各大品牌廠商販售比價網!

※如何知道自已的電腦cpu支不支持AVX指令集?

※如何正確使用飲水機?

※攻戰消費者第一視覺,包裝設計很重要!

※滑鼠墊適用各種文宣活動廣告曝光,專業客製服務

※封口機購物網-不怕你比價,就怕你買貴!

※高溫殺菌機最多可達多少溫度?

當地一位村民對媒體透露,此次傷亡人比較多

當地一位村民對媒體透露,此次傷亡人比較多,下雨水庫洩洪未事先通知是一個方面原因,但最主要的原因還是房屋質量問題。

村民說,該村多年前修路拆遷,但是村民的補償沒有到位,數百戶村民一直住在村部廣場前的活動板房內,是村民自己蓋起來的簡易房,這次遇難的都是住在板房裡的人,所以這麼多人遇難。

微博上也有多個網友留言稱,柳陂政府不作為,補償沒不到位,使該村不少人住在臨時房裡,才是導致這次人員死亡的關鍵原因。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※無塵擦拭紙各大品牌廠商販售比價網!

※如何正確使用飲水機?

※如何知道自已的電腦cpu支不支持AVX指令集?

※掌握產品行銷策略,帶你認識商品包裝設計基本要素

※商業用玻璃煎台不必開大火也能迅速導熱

※選用哪種桶裝水,外宿露營超方便?

※空壓機這裡買最划算!

新北市長侯友宜青業燃料油改氣,2020年瀝青業加裝空污連續自動監測設施

新北市長侯友宜青業燃料油改氣,2020年瀝青業加裝空污連續自動監測設施,2022年燃煤汽電共生機組退場等政策,以及落實移動污染源與逸散污染源的管制。

今天表示,為持續防治空氣污染,要求落實燃煤鍋爐退場等政策,希望新北市在民國111年達成無煤城市的目標,使空氣更清新,全面符合國家空氣品質標準。

侯友宜7日在市政會議聽取環保局防治空污的具體作為,其中包括108年底燃煤鍋爐退場、瀝

侯友宜會後接受媒體聯訪表示,新北市面對空氣的品質管理,希望從今年開始PM2.5達成15微克立方米的國家標準,從防治的三級改成二級管制區,尤其在他任內能夠達標。

他表示,空污防治達標,特別要求燃煤鍋爐要全面退場及瀝青業燃油改氣,燃煤汽電共生機組全部退場,讓新北市在111年達成無煤城市目標。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※客製專屬滑鼠墊、可愛造型L夾、L型資料夾、透明證件套、手提袋,專業印刷設計廠商!  

※示波器鮮為人知的使用技巧?

※掌握產品行銷策略,帶你認識商品包裝設計基本要素

※買不起高檔茶葉,精緻包裝茶葉罐,也能撐場面!

※各種升降平台款式?

※高效率洗滌塔活性碳設備有哪些?

※空壓機這裡買最划算!

一起玩轉微服務(9)——前後端分離

前後端分離

在傳統的web應用開發中,大多數的程序員會將瀏覽器作為前後端的分界線。將瀏覽器中為用戶進行頁面展示的部分稱之為前端,而將運行在服務器,為前端提供業務邏輯和數據準備的所有代碼統稱為後端。 由於前後端分離這個概念相對來說剛出現不久,很多人都是只聞其聲,不見其形,所以可能會對它產生一些誤解,誤以為前後端分離只是一種web應用開發模式,只要在web應用的開發期進行了前後端開發工作的分工就是前後端分離。 其實前後端分離並不只是開發模式,而是web應用的一種架構模式。在開發階段,前後端工程師約定好數據交互接口,實現并行開發和測試;在運行階段前後端分離模式需要對web應用進行分離部署,前後端之前使用HTTP或者其他協議進行交互請求。 前後端分離原則,簡單來講就是前端和後端的代碼分離也就是技術上做分離。推薦的模式是最好直接採用物理分離的方式部署,進一步促使進行更徹底的分離。不要繼續以前的服務端模板技術,比如JSP ,把Java JS HTML CSS 都堆到一個頁面里,稍複雜的頁面就無法維護。

好處

這種分離模式的方式有幾個好處:

•前後端技術分離,可以由各自的專家來對各自的領域進行優化,這樣前端的用戶體驗優化效果會更好。•分離模式下,前後端交互界面更加清晰,就剩下了接口和模型,後端的接口簡潔明了,更容易維護。•前端多渠道集成場景更容易實現,後端服務無需變更,採用統一的數據和模型,可以支撐前端的web UI\ 移動App等訪問。

前後端分離意味着,前後端之間使用 JSON 來交流,兩個開發團隊之間使用 API 作為契約進行交互。從此,後台選用的技術棧不影響前台。 前後端分離並非僅僅只是前後端開發的分工,而是在開發期進行代碼存放分離、前後端開發職責分離,前後端能夠獨立進行開發測試;在運行期進行應用部署分離,前後端之間通過HTTP請求進行通訊。前後端分離的開發模式與傳統模式相比,能為我們提升開發效率、增強代碼可維護性,讓我們有規劃地打造一個前後端並重的精益開發團隊,更好地應對越來越複雜多變的Web應用開發需求。 前後端分離的核心:後台提供數據,前端負責显示。

常見的前端

AngularJS

Angular JS (Angular.JS) 是一組用來開發 Web 頁面的框架、模板以及數據綁定和豐富 UI 組件。它支持整個開發進程,提供 Web 應用的架構,無需進行手工 DOM 操作。 AngularJS 很小,只有 60K,兼容主流瀏覽器,與 jQuery 配合良好。

數據綁定可能是 AngularJS 最酷最實用的特性。它能夠幫助你避免書寫大量的初始代碼從而節約開發時間。一個典型的 Web 應用可能包含了 80% 的代碼用來處理,查詢和監聽 DOM。數據綁定使得代碼更少,你可以專註於你的應用。

傳統來說,當 Model 變化了。 開發人員需要手動處理 DOM 元素並且將屬性反映到這些變化中。這個一個雙向的過程。一方面,Model 變化驅動了 DOM 中元素變化,另一方面,DOM 元素的變化也會影響到 Model。這個在用戶互動中更加複雜,因為開發人員需要處理和解析這些互動,然後融合到一個 Model 中,並且更新 View。這是一個手動的複雜過程,當一個應用非常龐大的時候,將會是一件非常費勁的事情。

特性二:模板

在 AngularJS 中,一個模板就是一個 HTML 文件。但是 HTML 的內容擴展了,包含了很多幫助你映射 Model 到 View 的內容。

HTML 模板將會被瀏覽器解析到 DOM 中。DOM 然後成為 AngularJS 編譯器的輸入。AngularJS 將會遍歷 DOM 模板來生成一些指導,即,directive(指令)。所有的指令都負責針對 View 來設置數據綁定。

我們要理解 AuguarJS 並不把模板當做 String 來操作。輸入 AngularJS 的是 DOM 而非 string。數據綁定是 DOM 變化,不是字符串的連接或者 innerHTML 變化。使用 DOM 作為輸入,而不是字符串,是 AngularJS 區別於其它的框架的最大原因。使用 DOM 允許你擴展指令詞彙並且可以創建你自己的指令,甚至開發可重用的組件。

特性三:MVC

針對客戶端應用開發 AngularJS 吸收了傳統的 MVC 基本原則。MVC 或者 Model-View-Controll 設計模式針對不同的人可能意味不同的東西。AngularJS 並不執行傳統意義上的 MVC,更接近於 MVVM(Model-View-ViewModel)。

特性四:依賴注入(Dependency Injection,即 DI)

AngularJS 擁有內建的依賴注入子系統,可以幫助開發人員更容易的開發,理解和測試應用。

DI 允許你請求你的依賴,而不是自己找尋它們。比如,我們需要一個東西,DI 負責找創建並且提供給我們。

特性五:Directives(指令)

指令是我個人最喜歡的特性。你是不是也希望瀏覽器可以做點兒有意思的事情?那麼 AngularJS 可以做到。
指令可以用來創建自定義的標籤。它們可以用來裝飾元素或者操作 DOM 屬性。

2. React

React 是一個用於構建用戶界面的 JAVASCRIPT 庫。
React 主要用於構建UI,很多人認為 React 是 MVC 中的 V(視圖)。
React 起源於 Facebook 的內部項目,用來架設 Instagram 的網站,並於 2013 年 5 月開源。
React 擁有較高的性能,代碼邏輯非常簡單,越來越多的人已開始關注和使用它。
使用 React 可以將一些簡短、獨立的代碼片段組合成複雜的 UI 界面,這些代碼片段被稱作“組件”。

React特點

  1. 聲明式設計 −React採用聲明範式,可以輕鬆描述應用。

  2. 高效 −React通過對DOM的模擬,最大限度地減少與DOM的交互。

  3. 靈活 −React可以與已知的庫或框架很好地配合。

  4. JSX − JSX 是 JavaScript 語法的擴展。React 開發不一定使用 JSX ,但我們建議使用它。

  5. 組件 − 通過 React 構建組件,使得代碼更加容易得到復用,能夠很好的應用在大項目的開發中。

  6. 單向響應的數據流 − React 實現了單向響應的數據流,從而減少了重複代碼,這也是它為什麼比傳統數據綁定更簡單。

Vue.js

Vue.js(讀音 /vjuː/, 類似於 view) 是一套構建用戶界面的漸進式框架。

Vue 只關注視圖層, 採用自底向上增量開發的設計。

Vue 的目標是通過盡可能簡單的 API 實現響應的數據綁定和組合的視圖組件。

 

 

Kotlin

Kotlin 是一種在 Java 虛擬機上運行的靜態類型編程語言,被稱之為 Android 世界的Swift,由 JetBrains 設計開發並開源。

Kotlin 可以編譯成Java字節碼,也可以編譯成 JavaScript,方便在沒有 JVM 的設備上運行。

在Google I/O 2017中,Google 宣布 Kotlin 成為 Android 官方開發語言。

 

5. Flutter

 

Flutter 由 Google 的工程師團隊打造,用於創建高性能、跨平台的移動應用。Flutter 針對當下以及未來的移動設備進行優化,專註於 Android and iOS 低延遲的輸入和高幀率。

Flutter 可以給開發者提供簡單、高效的方式來構建和部署跨平台、高性能移動應用;給用戶提供漂亮、快速、jitter-free 的 app 體驗。

Flutter 的主要組件:

  • 一個高度優化, mobile-first 2D 渲染引擎 (保護對 text 優秀的支持 )

  • 一個 functional-reactive 框架 (可選的,你也可以引入你自己的框架)

  • 一組 Material Design 部件 (可選的,你也可以引入你自己的部件)庫 ,工具,和一個用於 Atom 的插件。

6. .Net

.NET是 Microsoft XML Web services 平台。XML Web services 允許應用程序通過 Internet 進行通訊和共享數據,而不管所採用的是哪種操作系統、設備或編程語言。Microsoft .NET 平台提供創建 XML Web services 並將這些服務集成在一起之所需。對個人用戶的好處是無縫的、吸引人的體驗。

這個不用說了,很大一部分人一直在用,而且作為master語言。但是對於微服務程序,感覺更適合於前端應用或者一些輕量級企業級的開發。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

Project Loom:Reactive模型和協程進行時(翻譯)

Java 15將發布Project Loom的第一個版本。我相信這將改變JVM。在這篇文章中,我想深入探討一下導致我相信這一點的原因。

首先,我們需要了解核心問題。然後,我將嘗試描述以前的技術如何解決它。之後,我們將看到Project Loom採取的方法。最後,我將推斷後者可能對生態系統產生什麼影響。

Project Loom

我們首先必須記住,很長一段時間以來,計算機只有一個內核。即使這樣,還是需要同時運行多個程序:這至少要運行兩個操作系統和適當的程序。

為了實現并行性的幻覺,它依賴於一個技巧。它運行一個程序,如果該程序沒有在特定的時間範圍內完成,它將存儲其狀態以供以後使用。然後,它運行下一個要運行的程序。有幾種算法可用來調度下一個程序:循環調度,加權循環調度等。好處是,所有這些都可以通過操作系統線程的概念很好地從開發人員中抽象出來。該操作系統通吃繁重的護理,包括存儲執行的狀態。但是,線程有兩個缺點:

  • 線程很重,因為它帶有很多狀態
  • 線程需要大量的機器資源來創建
    在所有情況下,現代OS都允許M個線程,其中M是數千個線程。現代機器是多核的,提供N個核,比M少兩個數量級。擁有多個內核(無論是物理內核還是虛擬內核)並不會從根本上改變底層機制:M遠高於N,並且OS負責從線程到內核的映射。

阻塞線程

面的模型在傳統方案中效果很好,但在網絡方案中效果不佳。假設有一個Web服務器需要響應HTTP請求。在過去不太好的時候,CGI是處理請求的一種方法。它將每個請求映射到一個流程,以便處理創建整個新流程所需的請求,並在發送響應后將其清除。

Java EE應用程序服務器極大地改善了這種情況,因為實現將線程保留在池中以供以後重用。但是,想象一下響應的生成需要時間,例如因為它需要訪問數據庫以讀取數據。在數據庫返回數據之前,線程需要等待。

這意味着線程實際上正在等待其生命周期的大部分時間。一方面,此類線程自己不使用任何CPU。另一方面,它使用其他種類的資源,尤其是內存。

同樣,太多線程是操作系統的負擔:操作系統必須在數量有限的CPU內核上平衡大量線程。這花費了寶貴的CPU周期,因此,操作系統正在與應用程序競爭CPU。

現在,併發請求的數量可以遠遠超過服務器可用的線程數量。因此,阻塞的線程浪費資源,並使服務器無響應。為了解決這個問題,可以添加更多的Web服務器來處理負載:這是水平縮放。

在大多數情況下,水平縮放就足夠了。等待阻塞線程所花費的時間是浪費的,但是沒有任何相關的費用…除非一個人的基礎架構位於’雲’中。在那種情況下,人們要為未使用的資源付費:這絕不是一個明智的主意。

單線程,反應式和Kotlin協程模型

對於開發人員來說,管理多個線程很複雜。例如,如果您一直在使用(或開發)Swing應用程序,則可能知道“灰色矩形效果”。當用戶與窗口的交互(例如單擊)啟動長時間運行的任務時,就會發生這種情況。如果將另一個窗口移到Swing窗口上,然後再移出,Swing不會重畫另一個窗口與Swing窗口相交的區域,而不會留下難看的灰色矩形。原因是長時間運行的任務是在“ 事件調度線程”上啟動的,而不是在專用線程上啟動的。而且這很容易避免,甚至不涉及在共享的可變狀態上進行同步!

為了避免這種情況,某些堆棧完全禁止開發人員使用多個線程。例如,Node.js的API僅提供一個非阻塞事件循環線程:提交的函數採用回調的形式。請注意,這不會阻止實現使用多個線程。

該反應的方法是另一種選擇,其實頗為相似。儘管它擺脫了單線程API的限制,並提供了反壓力機制,但它仍然需要非阻塞代碼。由於OS線程很昂貴,因此Reactive將它們池化,並在整個應用程序生命周期中重複使用它們。核心過程是從池中獲取空閑線程,讓其執行代碼,然後將線程釋放回池中。這就是為什麼它需要非阻塞代碼的原因:如果代碼阻塞了,那麼執行線程將不會被釋放,並且池將在某一點或另一點耗盡。

我感興趣地觀察了Reactive模型如何像篝火一樣在Spring生態系統中傳播,儘管我選擇站在一邊。恕我直言,反應式有幾個缺點:

  • 編寫(和閱讀!)反應式代碼的思維方式與編寫傳統代碼的思維方式非常不同。我願意承認改變心態只需要時間,持續時間取決於每個開發人員。
  • 儘管真正的開發人員不會調試,但我知道很多人會調試-包括我自己。由於上述線程切換的魔力,要跟蹤一段代碼及其相關的狀態並不容易。這需要足夠的工具,例如帶有相關插件的 IntelliJ IDEA 。
  • 最後,出於相同的原因,傳統的堆棧跟蹤也無濟於事。一些黑魔法可以繞開它。但是,這不是為了膽小者。有關選項的完整列表,請查看此文檔。

Kotlin語言提供了Reactive方法的替代方法:協程。簡而言之,當使用suspend關鍵字時,Kotlin編譯器會在字節碼中生成一個有限狀態機。好處是在協程塊中調用的函數看起來像是順序執行的,儘管它們是并行執行的-更確切地說,取決於確切的範圍,有可能會執行。

Project Loom和虛擬線程

Reactive模型和Kotlin協程都在客戶端代碼和JVM線程之間添加了一個額外的抽象層。框架/庫的職責是動態地將一個映射到另一個。問題的癥結在於JVM線程是OS線程的薄包裝:請記住,OS線程創建起來很昂貴,並且數量限製為數千個。

Project Loom的目標是實際上將JVM線程與OS線程解耦。
當我第一次意識到該倡議時,其想法是創建一個稱為Fiber(線程,Project Loom,您能抓住麻煩嗎?)的抽象。一個Fiber責任是讓一個操作系統線程,使其運行代碼,釋放回池,就像無棧一樣。

當前的建議有很大的不同:Fiber它沒有使用新的類,而是重新使用了Java開發人員非常熟悉的一個類- java.lang.Thread!

因此,在新的JVM版本中,某些Thread對象可能是重量級的並映射到OS線程,而另一些對象可能是虛擬線程。

Project Loom發布的後續影響

主要問題是,既然JVM API提供了對OS線程的抽象,那麼其他抽象(例如響應式和協程)又會變成什麼樣呢?我對預測不滿意,但以下是Reactive /協程背後的公司可能採取的一些態度:

  • 正面態度,他們意識到自己的框架不再帶來任何附加值,而只是重複。他們停止了開發工作,僅向現有客戶提供維護版本。他們幫助說客戶遷移到新的ThreadAPI,一些幫助可能是以付費諮詢的形式。
  • 反面態度,他們在各自的框架中投入了大量的精力之後,他們決定繼續進行,好像什麼也沒有發生。例如,Spring框架負責實際設計一個共享的Reactive API,稱為Reactive Streams,沒有Spring依賴項。當前有兩種實現,RxJava v2和Pivotal的Project Reactor。另一方面,JetBrains宣傳Kotlin的協程是并行運行代碼的最簡單方法。
  • 中間態度。這兩個框架都將繼續其生命,但是會將它們各自的基礎實現更改為使用虛擬線程。
    由於沉沒成本的謬誤,排在第一位的可能性極小:銷售和市場營銷將努力保持其“競爭優勢”-無論在他們眼中意味着什麼。儘管有些工程師出於相同的原因希望保留現有代碼,但其他一些工程師則將努力使用新的API。因此,我也不相信第二名也會發生。但是,我認為這兩個工程派之間都發揮着力量,然後它們與市場營銷/銷售之間將在#3之間找到平衡。

結論

Project Looms將現有的Thread實現方式從OS線程的映射更改為可以表示此類線程或虛擬線程的抽象。就其本身而言,這是一個有趣的舉動,它在一個平台上歷來比創新更重視向後兼容性。與其他最新的Java版本相比,此功能是真正的遊戲規則改變者。一般而言,開發人員應儘快開始熟悉它。打算學習Reactive和協程的開發人員可能應該退後一步,並評估他們是否應該學習新的ThreadAPI- 是否需要。

翻譯原文

https://blog.frankel.ch/project-loom-reactive-coroutines/

擴展閱讀

Project Loom地址: https://github.com/openjdk/loom
Project Loom現有狀態: http://cr.openjdk.java.net/~rpressler/loom/loom/sol1_part1.html

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

父親節逢地牛翻身,幸核電廠運作均正常!

8日5點28分東部外海芮氏規模6.0地震,幾乎全台震動,有3座核電廠所在的北部地區震度也高達4級,觸動核電廠地震儀,不過原能會表示,目前核電機組運座均正常,後續會持續監控。根據氣象局資料,8日各地震度,宜蘭武塔達到6級、宜蘭市達到5級、花蓮4級、雙北地區、新竹、桃園、台中4級、南投、苗栗、彰化、雲林3級、嘉義、台南2級、台東、高雄、屏東、澎湖1級。

原能會表示,地震觸發核一、二、四廠地震儀動作,圍阻體廠房底層地震儀測得最大加速度值分別為0.0085g、0.0512g、0.0261g,電廠依程序書執行現場巡視結果無異常,確認機組一切正常。至於位於屏東的核三廠,原能會指出,核三廠未達地震儀動作設定點,機組也正常運轉。原能會將持續關注後續地震之狀況,以監控電廠安​​全。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※哪裡買的到省力省空間,方便攜帶的購物推車?

※廢氣洗滌塔,叫得動, 找得到的專業廠商‎

※市面十大品牌封口機!該如何選購?

※塑膠射出成型加工商品有哪些?

※選用哪種桶裝水,外宿露營超方便?

※各款電動堆高機價格?

※掌握產品行銷策略,帶你認識商品包裝設計基本要素

聯合國糧農組織月9日呼籲亞洲各國做好邊境防疫工作,防止豬瘟蔓延

聯合國糧農組織月9日呼籲亞洲各國做好邊境防疫工作,防止豬瘟蔓延。

糧農組織表示,一年時間當中感染豬瘟死亡的豬數量,加上出於預防而被處理掉的豬數量,總共有500萬頭,為了阻止豬瘟擴散,亞洲各國需要強化控制防疫:「由於貿易過程當中沒有預防疫苗可用,各國都必須對陸上,海洋和空中邊檢防疫進行嚴格篩查,以阻止豬瘟通過動物之間的感染或染病豬肉類產品而擴散得更廣」。

聯合國糧農組織稱,目前有柬埔寨、中國、朝鮮、寮國、蒙古國和越南六個亞洲國家出現豬瘟疫情,其中在中國,越南和蒙古國,因豬瘟而造成的損失豬數量佔據全部豬數量的10%。

本站聲明:網站內容來源於https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※無塵擦拭紙各大品牌廠商販售比價網!

※如何知道自已的電腦cpu支不支持AVX指令集?

※如何正確使用飲水機?

※攻戰消費者第一視覺,包裝設計很重要!

※滑鼠墊適用各種文宣活動廣告曝光,專業客製服務

※封口機購物網-不怕你比價,就怕你買貴!

※高溫殺菌機最多可達多少溫度?