RocketMQ生產者Producer啓動時是否需要指定TOPIC

       Producer啓動是和Name Server建立連接不需要指定TOPIC,Producer發送消息需要和Broker(master)建立連接需要指定TOPIC。關於這個結論我們可以從Producer的使用和連接機制着手理解,理論結合實際嘛。

啓動代碼和消息發送代碼

/*1.producer的配置 init-start方法在實例化對象的時候執行,通過配置文件我們可以直觀的發現“Producer啓動時不需要指定TOPIC”
*
**/
<bean id="producer" class="com.mlycan.dbus.rmq.producer.RocketMQProducerImpl"
          lazy-init="true" init-method="start" destroy-method="shutdown">
        <constructor-arg value="mq_group_default_clustering" index="0"></constructor-arg>
        <property name="namesrvAddr" value="127.0.0.1:9876"/>
        <property name="retryTimesWhenSendFailed" value="3"/>
    </bean>
/*2.producer發送消息,發送消息也是producer和broker建立長連接的觸發機制*/
//2.1消息指定topic和tag
Message msg = new Message(topic,tag,msgKey,
                JSON.toJSONString(messageData).getBytes(Charset.forName("utf-8")));

//設置延遲消息級別
// messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
 msg.setDelayTimeLevel(4);

        //發送消息
SendResult sresult = producer.sendMessage(msg);

Producer連接機制:
      首先Producer隨機和Name Server中的一個節點建立長鏈接,並與提供Topic服務的Master任意一個broker建立長連接,然後每隔30s獲取所有Topic隊列的最新狀況,而Broker每隔10s掃描所有存活的連接,2分鐘內沒收到心跳數據,則關閉與Producer的連接。這意味着,如果Broker不可用,Producer在30s後需要從Topic隊列中重新獲取一個Broker並建立長連接,如果Producer與Broker之間的連接斷開,Producer則需要重新建立連接。
從Proucer的連接機制我總結出以下觀點:
1.Poducer不需要時刻與Name Server或者Broker保持長連接;長連接的建立是爲了減少重複連接造成的資源消耗,但是長時間保持空連接同樣會帶來資源浪費,因此Producer的長連接是指在使用頻率高的期間裏保持長連接。換句話說Producer的重複連接是RocketMQ可以接受的,而且並不影響系統使用。
2.Producer和Name Server建立連接時不需要指明Topic:Producer和Name Server建立連接後才能獲取提供Topic服務的Broker信息。
3.Producer在發送消息的時候才需要和Broker建立長連接
4.Producer建立和Broker連接時需要指明Topic:Producer長連接需要和提供Topic服務的Broker建立。Producer發送消息只發送到master的broker機器,在通過broker的主從複製機制拷貝到broker的slave上去。
        關於Producer的連接機制可以參考一下https://www.jianshu.com/p/e313e59e5c83和https://www.jianshu.com/p/e5cfb4ba925e感覺寫的很詳細了。
總結:
理論知識很多,但是沒有實際問題的碾壓,知道的越多疑惑也就也越多。記這個點主要是項目中遇到這麼一個問題,系統中有多個Topic主題,但是呢爲了避免重複寫多個Producer,就希望通過公共Producer實現。這裏有個烏龍事件就是我一直把Producer的group記成了Topic,所以就有了需要啓動多個Producer的問題。通過重新對Producer連接機制的梳理,Producer的Topic風波總算是告一段落。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章