Posted on 2009-09-18 00:09
dennis 閱讀(2863)
評論(1) 編輯 收藏 所屬分類:
模式與架構 、
涂鴉 、
工作隨筆
MQ在分布式系統中扮演著重要角色,異步的消息通信全要靠它,而異步通信正是提高系統伸縮性的不二良方。說說我認為的一個優秀的MQ產品需要具備的特征。
首先顯然是高可用性,我們當然希望MQ能支撐7x24小時應用,而不是三天兩頭當機,我們要追求的是99.9%的可靠服務時間。要做到高可用性,顯然我們需要做MQ的集群,一臺當了,不影響整個集群的服務能力,這里涉及到告警、流控、消息的負載均衡、數據庫的使用、測試的完備程度等等。
其次是消息存儲的高可靠性。我們要保證100%不丟消息。要做到消息存儲的高可靠性,不僅僅是MQ的責任,更涉及到硬件、操作系統、語言平臺和數據庫的一整套方案。許多號稱可靠存儲的MQ產品其實都不可靠,要知道,硬件錯誤是常態,如果在硬件錯誤的情況下還能保證消息的可靠存儲這才是難題。這里可能需要用到特殊的存儲硬件,特殊的數據庫,分布式的數據存儲,數據庫的分庫分表和同步等等。你要考慮消息存儲在哪里,是文件系統,還是數據庫,是本地文件,還是分布式文件,是搞主輔備份呢還是多主機寫入等等。
第三是高可擴展性,MQ集群能很好地支持水平擴展,這就要求我們的節點之間最好不要有通信和數據同步。
第四是性能,性能是實現高可用性的前提,很難想象單機性能極差的MQ組成的集群能在高負載下幸免于難。性能因素跟采用的平臺、語言、操作系統、代碼質量、數據庫、網絡息息相關。MQ產品的核心其實是消息的存儲,在保證存儲安全的前提下如何保證和提高消息入隊的效率是性能的關鍵因素。這里需要開發人員建立起性能觀念,不需要你對一行行代碼斤斤計較,但是你需要知道這樣做會造成什么后果,有沒有更好更快的方式,你怎么證明它更好更快。軟件實現的性能是一方面,另一方面就是平臺相關了,因為MQ本質上是IO密集型的系統,瓶頸在IO,如何優化網絡IO、文件IO這需要專門的知識。性能另一個相關因素是消息的調度上,引入消息順序和消息優先級,允許消息的延遲發送,都將增大消息發送調度的復雜性,如何保證高負載下的調度也是要特別注意的地方。
第五,高可配置性和監控工具的完整,這是一個MQ產品容易忽略的地方。異步通信造成了查找問題的難度,不像同步調用那樣有相對明確的時序關系。因此查找異步通信的異常是很困難的,這就需要MQ提供方便的DEBUG工具,查找分析日志的工具,查看消息生命周期的工具,查看系統間依賴關系的工具等等。可定制也是MQ產品非常重要的一方面,可方便地配置各類參數并在集群中同步,并且可動態調整各類參數,這將大大降低維護難度。
一些不成熟的想法,瞎侃。