rocketmq-2:性能測試方案&壓測&選型&結論

                        小編:管理員 158閱讀 2022.08.03

                        (1).性能測試方案

                        1.理想測試方案

                        關注qps和lantency即可,消息丟失需要使用者在開發時處理,比如消息發送加重試機制(這里有講究,也不是隨便寫的,也涉及到rocketmq-broker的流控機制,下一篇聊)。

                        但實際上,不可能這樣操作,原因:機器資源占用太多,最主要的是時間不允許。

                        2.實際測試方案&測試結果

                        (2).測試機型&資源分配

                        全部使用阿里云的ecs.sn1ne.xlarge機型,都是4core8G,相對來說性價比最高,網絡有加強,內核參數有優化,如下:

                        使用rocketmq默認提供的benchmark腳本工具進行壓測。

                        topic:BenchmarkTest

                        queue:1024/broker

                        (3).相關監測數據

                        以測試用例BT-P&C-MSG-SIZE1024-2brokerMaster-2BrokerSlaves-0003-1為例:

                        2個brokerMaster, 2個brokerSlave,且broker配置為:

                        brokerRole = ASYNC_MASTER flushDiskType = ASYNC_FLUSH

                        1.整體概覽

                        施壓機消息發送情況:

                        消費者消費情況:

                        broker-master-1節點的iostat:

                        broker-slave-1節點的iostat:

                        2.broker-master-1節點監控數據

                        3.broker-slave-1節點監控數據

                        4.consumer1節點監控數據

                        5.施壓機(producer)監控數據

                        (4).最終選型

                        機器選型:

                        磁盤選型:

                        這里有一個問題:實際上不需要這么大的盤,100GB的SSD足夠用了,后續會替換為100GB的SSD,成本更劃算,而且TPS和lantency會更加漂亮;消息發送的重試次數會大幅減少。

                        附,官方關于資源的分布反饋:

                        (5).總結

                        1.不需要擔心rocketmq的處理能力/TPS簡單估算方法

                        關于TPS的計算很簡單(async_master,async_flush):

                        在使用物理磁盤的前提下,max(broker-master單節點 TPS)=物理磁盤的最大寫入速度/消息大小=max(rocketmq producer send TPS)

                        在使用SSD盤的前提下,max(broker-master單節點 TPS)=SSD盤的最大寫入速度/消息大小=max(rocketmq producer send TPS)

                        我使用1KB的消息測試其實已經很大了,實際生產環境不會這么用,消息體都是盡可能小的。

                        2.不需要使用sync_master

                        會嚴重降低TPS,我的測試結果是直接降了一個數量級;而且也沒有必要,除非是金融等高要求的場景必須保證副本,開啟后多掛幾組broker-master/slave,增加rocketmq的并行吞吐能力,提高TPS。

                        3.我們為什么選擇async_master,async_flush

                        很簡單,不是金融等高要求場景,而且這種模式下的可用性其實也是非常高的,更關注TPS,且同時關注成本。

                        但要注意前提是業務code要正確處理消息重試,消息重復消費,這個不是rocketmq保證的,以后會聊一聊這方面。

                        rocketmq的async_master和async_flush類似于kafka的acks,類似,不是完全等價。

                        4.我們需要讓開發同學低成本的使用rocketmq

                        我們的做法是自己開發了一個框架,完全是注解是開發,將rocketmq的producer和consumer封裝到框架里,配置都在apollo,開發同學使用時直接加幾個注解即可完成producer,consumer的對象實例化,非常方便,不會出錯。

                        而且還集成了prometheus,可以將producer和consumer的發送全程,消費全程監控起來,比如TPS過高時,會觸發rocketmq的流控,直接將msg寫入請求拒絕且不會重試,此時要在框架中自己實現重試機制,且加入prometheus監控:

                        直接監控到節點的進程,哪個JVM實例發生rocketmq使用異常一目了然。

                        prometheus其他監控:

                        目前暫時只開發了兩個維度:消息發送全程監控(粒度到進程),消息堆積數監控(對于rocketmq集群,粒度到broker的queue;對于業務jvm,粒度到進程)。

                        非常有助于rocketmq的正確使用,和問題發現。

                        另:

                        官方也有一個rocketmq的prometheus-exporter(但是維度不全),也會使用:

                        https://github.com/apache/rocketmq-externals/tree/master/rocketmq-prometheus-exporter

                        5.以后也會將rocketmq容器化

                        放入K8S自帶守護,正在進行中。

                        關聯標簽:
                        少妇各种各样BBBⅩXX