再說mq以前咱們先說說背景吧,MQ(message queue簡稱消息隊列)主要做用不是通信,主要是用於解除子系統間的耦合,因此異構系統間的通信實際並非mq發揮做用的場景,那反而是RPC(remote procedure call)發揮做用的時候, mq更適合於須要更大流量和高併發的大型系統場景,能夠將消息隊列視爲一個可靠的通道,主交易過程在處理時,遇到需時較多同時又已經肯定了條件的處理就丟到消息隊列裏進行後續處理,這樣能夠將主交易過程劃分爲一個一個能夠異步處理的更小的處理過程,減小了主交易流程的處理時間,能夠提供更快的響應速度和併發速度,例如,像淘寶這樣的處理邏輯很是多的系統,在處理付款時,就能夠將通知買家和賣家、記日誌甚至記賬流程都放到消息隊列裏處理,整個主流程可以快速處理完成,繼續處理下一個買家的請求java
MetaQ(全稱Metamorphosis)是一個高性能、高可用、可擴展的分佈式消息中間件,思路起源於LinkedIn的Kafka,但並非Kafka的一個Copy。MetaQ具備消息存儲順序寫、吞吐量大和支持本地和XA事務等特性,適用於大吞吐量、順序消息、廣播和日誌數據傳輸等場景mysql
(1) 日誌傳輸,用於高吞吐量的日誌傳輸;linux
(2) 消息廣播,將消息放入Topic中,供全部的消費者消費;git
(3) 數據的順序同步功能,如mysql binlog複製;github
(4) 分佈式環境下(broker、producer、consumer都爲集羣)的消息路由,對順序和可靠性有極高的要求的應用場景;sql
(5) 做爲通常的MQ來使用其功能瀏覽器
MetaQ的安裝比較簡單,只須要將服務器包下載下來解壓到指定位置就行。下載metaq-server-1.4.6.2.tar.gz(https://github.com/killme2008/Metamorphosis/wiki/ReleaseNotes)服務器
使用下面命令進行解壓數據結構
tar –zxvf metaq-server-1.4.6.2.tar.gz
通常狀況下,咱們須要用到的是其bin下的幾個服務器腳本。併發
(1) Bin目錄下有metaServer.sh腳本,該腳本是主要的執行腳本;
(2) Logs目錄下有相關的MetaQ日誌信息;
(3) Conf目錄下有主要的配置文件server.ini;
(4) Lib目錄下是相關的依賴包
啓動服務器:
software/bin/metaServer.sh start;
關閉服務器:
software/bin/metaServer.sh stop
查看服務器狀態:
software/bin/metaServer.sh status
須要先配置zookeeper,不然會啓動失敗
首先安裝ZK
其次在software/metaq/conf 目錄下打開server.ini文件,配置以下關聯的ZK信息:
;zk的服務器列表 zk.zkConnect=192.168.66.78:2181 ;zk心跳超時,單位毫秒,默認30秒 zk.zkSessionTimeoutMs=30000 ;zk鏈接超時時間,單位毫秒,默認30秒 zk.zkConnectionTimeoutMs=30000 ;zk數據同步時間,單位毫秒,默認5秒 zk.zkSyncTimeMs=5000
啓動成功之後在瀏覽器中輸入http://192.168.66.78:8120/,會顯示MetaQ主頁面
項目中的使用能夠參照我在github上面的例子:https://github.com/xiaobianchen/arch-message/
metaq裏面的代碼
Producer: 消息生產者,負責產生消息,通常由業務系統負責產生消息。 Consumer: 消息消費者,負責消費消息,通常是後臺系統負責異步消費。 Consumer Group: 一類Consumer的集合名稱,這類Consumer一般消費一類消息,且消費邏輯一致。 Topic: 消息的主題,由用戶定義並在服務器端配置。Producer發送消息到某個Topic下,Consumer從Topic下消費消息。 Broker: 消息中轉角色,負責存儲消息,轉發消息,通常也稱爲Server,在JMS規範中稱爲Provider。 分區(partition): 同一個topic下面還分爲多個分區,如meta-test這個topic咱們能夠分爲10個分區,分別有兩臺服務器提供,那麼可能每臺服務器提供5個分區,假設服務器id分別爲0和1,則全部分區爲0-0、0-一、0-二、0-三、0-四、1-0、1-一、1-二、1-三、1-4。 Offset: 消息在broker上的每一個分區都是組織成一個文件列表,消費者拉取數據須要知道數據在文件中的偏移量,這個偏移量就是所謂offset。Offset是絕對偏移量,服務器會將offset轉化爲具體文件的相對偏移量。 廣播消費(典型的朋友圈發微博): 一條消息被多個Consumer消費,即便這些Consumer屬於同一個Consumer Group,消息也會被組中的每個Consumer消費一次。 集羣消費: 一個Consumer Group中的Consumer實例平均分攤消費消息。 主動消費: Consumer主動向Broker發起獲取消息請求,控制權徹底在於Consumer應用。 被動消費: Consumer註冊一個Callback接口,由MetaQ後臺自動從Broker接收消息,並回調Callback接口。 順序消息: 消費消息的順序要同發送消息的順序一致,在MetaQ中,主要指的是局部順序,即一類消息爲知足順序性,必須Producer單線程順序發送,且發送到同一個隊列中。 普通順序消息: 順序消息中的一種,正常狀況下保證消息的順序,但發生異常後,例如Broker重啓,隊列發生變化,產生短暫的消息順序不一致。 嚴格順序消息: 順序消息的一種,不管什麼狀況下都能保證消息的順序,犧牲了分佈式的Failover的特性。 Message Queue: 在MetaQ中,全部的消息隊列都是持久化,長度無限的數據結構,所謂長度無限是指隊列中的每一個存儲單元都是定長,訪問其中的存儲單元使用Offset來訪問,Offset爲java long類型,64位,理論上在100年內不溢出,因此認爲是長度無限,隊列中只保留幾天的數據,以前的數據會被定時刪除。 Messaging System: 消息中間件的統稱,但不侷限於消息中間件,與消息傳輸相關的相似系統。
metaq集羣
http://www.iteye.com/magazines/107
http://blog.csdn.net/wych1981/article/details/45166769
http://www.linuxidc.com/Linux/2014-02/97299.htm
http://linuxblind.blog.51cto.com/7616603/1266752
https://my.oschina.net/MrMichael/blog/528196
https://github.com/killme2008/Metamorphosis/wiki/%E5%A6%82%E4%BD%95%E5%BC%80%E5%A7%8B