1. 程式人生 > >2019第2周日-要點回顧

2019第2周日-要點回顧

發送消息 工作 消費 集群 中間件 rabbitmq bsp 實現 會話

消息中間件的可靠性是指對消息不丟失的保障程度;而消息中間件的可用性是指無故障運行的時間百分比,通常用幾個 9 來衡量。不存在絕對的可靠性只能盡量趨向完美。並且通常可靠性也意味著影響性能和付出更大的成本,因此實際應用時還要根據業務需求,對真正關鍵的信息來做可靠性保證,並要從生產者、消息隊列、消費者三個維度來努力。如果在發送消息時采用了事務機制或者publisher confirm機制的話,服務端的返回是在消息落盤之後執行的,這樣可以進一步的提高了消息的可靠性。但是即便如此也無法避免單機故障且無法修復(比如磁盤損毀)而引起的消息丟失,這裏就需要引入鏡像隊列。鏡像隊列相當於配置了副本,絕大多數分布式的東西都有多副本的概念來確保HA。在鏡像隊列中,如果主節點(master)在此特殊時間內掛掉,可以自動切換到從節點(slave),這樣有效的保證了高可用性,除非整個集群都掛掉。雖然這樣也不能完全的保證RabbitMQ消息不丟失(比如機房被炸。。。),但是配置了鏡像隊列要比沒有配置鏡像隊列的可靠性要高很多,在實際生產環境中的關鍵業務隊列一般都會設置鏡像隊列。

一個軟件(程序庫)可支持多種協議(例如ActiveMQ實現了多種消息協議),某一種協議(尤其是開放協議)也可被多種軟件(程序庫)實現(例如能夠支持webservice協議的程序庫就有Codehaus XFire、Apache CXF、Jboss RESTEasy等)分布式系統中常用通訊模型主要是“請求-應答”模型和“發布-訂閱”模型。前者常見如RPC通訊,常用HTTP REST或Thrift等協議;後者多指消息隊列MQ通訊。RPC大多屬於請求-應答模式,也包括越來越多響應式範式,對於需要點對點交互、強事務保證和延遲敏感的服務/應用之間的通信,RPC是優於消息隊列的。那麽消息隊列(下文也簡稱MQ,即Message Queue)可以看做是一種異步RPC,把一次RPC變為兩次或多次,進行內容轉存,再在合適的時機投遞出去。消息隊列中間件往往是一個分布式系統,內部組件間的通信仍然會用到RPC。 通過JMS規範,開發人員可以忽略各種消息協議的細節,只要消息在同一隊列中,就能夠保證各種消息協議間實現互相轉換。

如果您不特別指定ActiveMQ的網絡監聽端口,那麽這些端口都將使用BIO網絡IO模型。所以為了首先提高單節點的網絡吞吐性能,我們需要明確指定Active使用NIO網絡模型。比起消息生產者來說消息消費者的性能更能影響ActiveMQ系統的整體性能,因為要成功完成一條消息的處理,它的工作要遠遠多於消息生產者。默認情況下ActiveMQ服務端采用異步方式向客戶端推送消息。也就是說ActiveMQ服務端在向某個消費者會話推送消息後,不會等待消費者的響應信息,直到消費者處理完消息後,主動向服務端返回處理結果。ActiveMQ中設置的各種默認預取數量一般情況下不需要進行改變。但是非必要情況下,請不要設置prefetchSize=1,因為這樣就是一條一條的取數據;也不要設置為prefetchSize=0,因為這將導致關閉服務器端的推送機制,改為客戶端主動請求。

2019第2周日-要點回顧