移動開發分布式系統,分布式系統中可橫向擴充套件是乙個相當重要的特性,加機器能解決的問題都不是問題。那麼如何實現乙個能夠實現橫向擴充套件的訊息佇列呢?
我們知道資料庫的qps是一定的,而上層應用一般可以橫向擴容,這個時候如果到了雙11這種請求突然的場景,資料庫會吃不消,那麼我們就可以引入訊息佇列,將每個隊資料庫的操作寫到日誌中,由另外乙個應用專門負責消費這些日誌記錄並應用到資料庫中,而且就算資料庫掛了,當恢復的時候也可以從上次訊息的位置繼續處理(rocketmq和kafka都支援exactly once語義),這裡即使生產者的速度異於消費者的速度也不會有影響,日誌在這裡起到了緩衝的作用,它可以將所有的記錄儲存到日誌中,並定時同步到sl**e節點,這樣訊息的積壓能力能夠得到很好的提公升,因為寫日誌都是有master節點處理,讀請求這裡分為兩種,一種是tail-read,就是說消費速度能夠跟得上寫入速度的,這種讀可以直接走快取,而另一種也就是落後於寫入請求的消費者,這種可以從sl**e節點讀取,這樣通過io隔離以及作業系統自帶的一些檔案策略,例如pagecache、快取預讀等,效能可以得到很大的提公升。
加入有乙個單機的訊息佇列,隨著topic數目的上公升,io、cpu、頻寬等都會逐漸成為瓶頸,效能會慢慢下降,那麼這裡如何進行效能優化呢?
1. topic/日誌分片,本質上topic寫入的訊息就是日誌的記錄,那麼隨著寫入的數量越多,單機會慢慢的成為瓶頸,這個時候我們可以將單個topic分為多個子topic,並將每個topic分配到不同的機器上,通過這種方式,對於那些訊息量極大的topic就可以通過加機器解決,而對於一些訊息量較少的可以分到到同一臺機器或不進行分割槽。
group commit,例如kafka的producer客戶端,寫入訊息的時候,是先寫入乙個本地記憶體佇列,然後將訊息按照每個分割槽、節點彙總,進行批量提交,對於伺服器端或者broker端,也可以利用這種方式,先寫入pagecache,再定時刷盤,刷盤的方式可以根據業務決定,例如金融業務可能會採取同步刷盤的方式。
規避無用的資料拷貝
io隔離
節點間資料同步、併發更新資料順序問題(一致性問題)、永續性(系統crash時能夠通過其他節點繼續提供服務)、分布式鎖服務
分布式系統
分布式系統和計算機網路系統的共同點是 多數分布式系統是建立在計算機網路之上的,所以分布式系統與計算機網路在物理結構上是基本相同的。他們的區別在於 分布式作業系統的設計思想和網路作業系統是不同的,這決定了他們在結構 工作方式和功能上也不同。網路作業系統要求網路使用者在使用網路資源時首先必須了解網路資源...
分布式系統
分布式,一來就直接看書,除非你有比較深厚的技術功底,要不還是很晦澀難懂的。先想想為什麼會有分布式,分布式怎麼來的。傳統的電信 銀行業,當業務量大了之後,普通伺服器cpu io 網路到了100 請求太慢怎麼辦?最直接的做法,公升級硬體,反正也不缺錢,ibm小型機,大型機,採購了堆硬體。但是網際網路不能...
分布式系統
zookeeper讓服務配置變得更簡單 zookeeper是hadoop下的乙個子專案,它是乙個針對大型分布式系統的可靠的協調系統,提供的功能包括 配置維護 名字服務 分布式同步 組服務等。zookeeper是可以集群複製的,集群間通過zab zookeeper atomic broadcast 協...