阿裡的rocketmq
RocketMQ是一款分布式、隊列模型的消息中間件,具有以下特點:
1、支援嚴格的消息順序;
2、支援Topic與Queue兩種模式;
3、億級消息堆積能力;
4、比較友好的分布式特性;
5、同時支援Push與Pull方式消費消息;
https://github.com/alibaba/RocketMQ/releases 最新版本
在生産環境部署Broker,請參考以下軟硬體要求
https://github.com/alibaba/RocketMQ/wiki/system_requirements
rabbit不知道,但是rocket的性能是(萬條每秒),并且能夠橫向無限擴充,單機topic數量在256時,性能損失較小。
rocket可以說是kafka的變種,是阿裡在充分reviewkafka代碼後,開發的metaQ。在不斷更新,修補以後,阿裡把metaQ3.0更名為rocket,并且rocket是java寫的易于維護。
另外就是rocket和kafka有類似無限堆積的能力。想想,斷電不丢消息,積壓兩億條消息毫無壓力,niubility
kafka和rocket性能根本不是你需要考慮的問題
導入本地包
mvn install:install-file -DgroupId=net.java.dev.jna -DartifactId=jna -Dversion=4.2.2 -Dpackaging=jar -Dfile=/root/jna-4.2.2.jar
以下文章非常有用
http://blog.csdn.net/zknxx/article/details/52974189
http://blog.csdn.net/crazyxq/article/details/52870502
rocketmq3.5.8 編譯好的包,自己編譯太坑了
http://download.csdn.net/download/zknxx/9668351
生産一般都主主吧
RocketMQ-3.5.8雙主雙從配置及部署說明
http://download.csdn.net/download/coffeelifelau/9667849
mkdir -p /var/log/rocketmqlogs
mkdir -p /data/rocketmq/store/commitlog /data/logs
nohup sh mqnamesrv > /var/log/rocketmqlogs/namesrv.log 2>&1 &
a伺服器
nohup sh mqbroker -c ../conf/2m-noslave/broker-a.properties >/dev/null 2>&1 &
b伺服器
nohup sh mqbroker -c ../conf/2m-noslave/broker-b.properties >/dev/null 2>&1 &
配置檔案參考
http://sofar.blog.51cto.com/353572/1540874
配置權限
chown -Rnobody.nobody Application
a.啟動NameServer[master-a,master-b]
cd /data/Application/rocketmq/bin
sudo -u nobody nohup sh/data/Application/rocketmq/bin/mqnamesrv &
b.啟動BrokerA[master-a]
sudo -u nobody nohup sh/data/Application/rocketmq/bin/mqbroker -c/data/Application/rocketmq/conf/2m-noslave/broker-a.properties >/dev/null2>&1 &
c.啟動BrokerB[master-b]
sudo -u nobody nohup sh/data/Application/rocketmq/bin/mqbroker -c/data/Application/rocketmq/conf/2m-noslave/broker-b.properties >/dev/null2>&1 &
關閉nameserver或broker
sh ./mqshutdown
Useage: mqshutdown broker | namesrv
注意:
運作sh os.sh,會發現swap會占用一半,而記憶體會占用很少。
如果需要恢複成開始的樣子,修改os.sh
sudo sysctl -w vm.extra_free_kbytes=0
sudo sysctl -w vm.min_free_kbytes=67584
sudo sysctl -w vm.overcommit_memory=0
sudo sysctl -w vm.drop_caches=0
sudo sysctl -w vm.zone_reclaim_mode=0
sudo sysctl -w vm.max_map_count=65530
sudo sysctl -w vm.dirty_background_ratio=10
sudo sysctl -w vm.dirty_ratio=20
sudo sysctl -w vm.dirty_writeback_centisecs=500
sudo sysctl -w vm.page-cluster=3
sudo sysctl -w vm.swappiness=60
然後重新開機後者用網上的swap.sh腳本找到占用swap的程序,重新開機之。
具體os.sh參數的作用
1.控制記憶體回收 grep low /proc/zoneinfo
這個參數值用來強制linux虛拟記憶體保留最小值的空閑
vm.extra_free_kbytes
vm.min_free_kbytes
2.vm.max_map_count 虛拟記憶體使用
3.vm.swappiness
執行這個腳本出現記憶體占用的少的原因,估計就是調了控制記憶體回收
應該是控制broker同步的頻率,這樣做之後,隻有很多的資料,才會同步。
測試
export NAMESRV_ADDR=ip1:9876\;ip2:9876
bash tools.sh com.alibaba.rocketmq.example.quickstart.Producer
bash tools.sh com.alibaba.rocketmq.example.quickstart.Consumer
要解決的問題
1.主主還是多主多從
http://blog.csdn.net/a19881029/article/details/34446629
2.如何順序消費
RocketMQ消費并行度分兩種情況
順序消費方式并行度同Kafka完全一緻
亂序方式并行度取決于Consumer的線程數,如Topic配置10個隊列,10台機器消費,每台機器100個線程,那麼并行度為1000
rocketmq 順序消費了解
http://blog.csdn.net/u011686226/article/details/53465357
https://github.com/alibaba/RocketMQ/search?utf8=%E2%9C%93&q=sequence
3.
你是叢集消費還是廣播消費,叢集消費的話每個消費者都會收到對應的消息,廣播則不會,另外即使是叢集環境下,也有可能重複消費消息,消費者自己要做到幂等
ps:說反了,不好意思,叢集消費,隻有一次,廣播則多次,
目前rocketmq消費是有叢集消費和廣播消費,上面的樓主說錯了,應該是叢集消費隻能有一個消費者消費一次,而廣播消費則是所有的消費者都會消費一次,至于出現重複消費的問題,一種可能的原因是消費者消費完有沒有做确認機制.
即使消費者做出了确認消費的辨別,消費者還是可能出現重複消費的情況,那是一般在高并發下的出現的,rocketmq有說明,幾乎主流的mq都有這種情況,一般的就是消費幂等
4.推薦Filter Server生産環境部署,為Consumer提供任意的伺服器消息過濾能力
5.支援Topic與Queue兩種模式 不是預設都同時支援的
6.rocketmq使用大記憶體是靠mmap堆外記憶體啊,而不是設定大的jvm堆記憶體的,java的堆最好不要超過10G,要不然性能不行
7.Producer/Consumer指定Name Server位址
通過代碼中指定
producer.setNamesrvAddr("192.168.0.1:9876;192.168.0.2:9876");
或
consumer.setNamesrvAddr("192.168.0.1:9876;192.168.0.2:9876");
通過Java啟動參數中指定
-Drocketmq.namesrv.addr=192.168.0.1:9876;192.168.0.2:9876
通過環境變量指定
exportNAMESRV_ADDR=192.168.0.1:9876;192.168.0.2:9876
8.監控
web平台監控
安裝tomcat
這裡就省略了。
将war放入webapps下,修改vimWEB-INF/classes/config.properties
rocketmq.namesrv.addr=RocketMQ01:9876 #這裡隻能寫一個
throwDone=true
監控需要自己git後,編譯,網上csdn有現成的。
本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/1882756,如需轉載請自行聯系原作者