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