RocketMQ之Producer

1

Producer有个ProducerGroup的值需要设置,因为Producer是可以分布式部署的,我们需要将逻辑上属于一个整体的producer关联起来,那就靠ProducerGroup这个值来设置的,同属一个group的producer产生的消息理论上应该是一个业务类型。构造Producer的时候可以指定:

private final DefaultMQProducer PRODUCER = new DefaultMQProducer("Producer-Group1");

2

Producer可以设置消息发送失败重试的次数和发送超时时间具体方法如下:

// 设置异步发送失败重试次数,默认2
PRODUCER.setRetryTimesWhenSendAsyncFailed(3);
// 设置同步发送失败重试次数,默认2
PRODUCER.setRetryTimesWhenSendFailed(3);
// 设置发送超时时间,包括同步和异步,默认3000ms
PRODUCER.setSendMsgTimeout(3000);

3

Producer可以设置InstanceName参数,instance代表的是Producer实例clientId,RocketMQ默认会使用ip@instanceName@unitName的方式来区分Producer实例,instanceName如果缺省就会被替换成PID,unitName缺省会为空,如果在一个JVM里启动多个Producer实例且缺省InstanceName值,那么clientId将会是一样,这时他们会使用同一个MQClientInstance,MQClientInstance是Consumer、Producer与NameServer、Broker通信的API,这样会导致消息只会发送到一个Broker

PRODUCER.setInstanceName("producer-instance1");

4

队列个数设置,同时在Broker的配置文件中也可以设置defaultTopicQueueNums=8,而且读、写队列的个数可以不一致,读队列针对Consumer,写队列针对Producer,如果写队列个数大于读队列个数,那么Producer会轮询写入各个写队列,但是多出来的队列不会被Consumer消费,也就是说有消息无法被消费,如果写队列个数小于读队列个数,那么多出来的是空的队列,没意义,所以读队列是依赖写队列的,实际存在的队列应该是以写队列

PRODUCER.setDefaultTopicQueueNums(6);

5

一个Producer启动时只与一个NameServer建立联系,然后从NameServer拉取Broker地址列表,然后与所有Broker建立联系,每个长连接都会有心跳机制保活。Producer启动的时候也会启动各种定时服务。主要有1、Producer与NameServer维护长连接,每隔30S获取其发送消息topic的最新数据,覆盖上次的MessageQueue,2、Producer每隔10min向其订阅topic所在的所有Broker发送心跳信息,心跳信息仅包含ProducerGroup。Broker为与Producer的长连接注册了ChannelEventListener,当Producer宕机时,立即删除此Producer的心跳信息。定时任务在Producer启动时开启,主要是MQClientInstance#start()方法。Producer和Consumer启动时都会调用MQClientInstance#start()方法,这里面有很多定时任务。

6

在RocketMQ中DefaultMQProducer是暴露给用户使用的,真正的实现是DefaultMQProducerImpl,这两个类没有继承关系,只是聚合关系,DefaultMQProducerImpl有自己独立的继承关系,和DefaultMQProducer没有任何关系,虽然他俩名字很暧昧。从具体设计上看到DefaultMQProducer因为面向应用,所以暴露的API和拥有的数据成员都是用户使用相关。我们主要看DefaultMQProducerImpl和MQClientInstance实现的区别和联系。一般情况下MQClientInstance和DefaultMQProducerImpl是一一对应的关系,当然你可以达到一对多的效果。MQClientInstance是客户端统一处理类,他涵盖了Producer和Consumer和mqadmin工具等的处理,这个是架构设计的表现了。也就是说Producer、Consumer、mqadmin等都会分别调用MQClientInstance的一部分功能,这里只看DefaultMQProducerImpl使用了MQClientInstance的哪些能力。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值