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风波总算是告一段落。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值