RocketMQ——Producer篇:其他功能介绍

来源:互联网 发布:mac sdk 环境变量配置 编辑:程序博客网 时间:2024/06/07 13:29

1 向Broker发送心跳消息

1、初始化HeartbeatData对象,将该Producer或Consumer的ClientID赋值给HeartbeatData对象的clientID变量;

2、遍历MQClientInstance.consumerTable: ConcurrentHashMap<String/* group */, MQConsumerInner>变量,根据每个MQConsumerInner对象的值初始化ConsumerData对象(包括GroupName、consumeType、MessageModel、consumeFromWhere、rebalanceImpl变量中的RebalanceImpl. subscriptionInner值初始化subscriptionDataSet:Set<SubscriptionData>变量、UnitMode),并将该对象放入HeartbeatData对象的ConsumerData集合变量consumerDataSet:Set<ConsumerData>中;

3、遍历MQClientInstance.producerTable: ConcurrentHashMap<String/* group */, MQProducerInner>变量;根据每条记录的ProducerGroup值初始化ProducerData对象,并放入HeartbeatData对象的ProducerData集合变量producerDataSet:Set<ProducerData>中;

4、若ConsumerData集合和ProducerData集合都为空,说明没有consumer或produer,则不发送心跳信息;

5、若不是都为空,则遍历MQClientInstance.brokerAddrTable列表,向每个Broker地址发送请求码为HEART_BEAT的心跳消息,但是当存在Consumer时才向所有Broker发送心跳消息,否则若不存在Consumer则只向主用Broker地址发送心跳消息;

2 处理Broker检查事务状态的消息(CHECK_TRANSACTION_STATE)

在Producer收到Broker的TransactionStateService类中定时任务发送的CHECK_TRANSACTION_STATE请求码之后,调用ClientRemotingProcessor.checkTransactionState(ChannelHandlerContext ctx, RemotingCommand request)方法处理,大致逻辑如下:

1、根据收到的事务消息的properties中的"PGROUP"参数值获取该事务消息是由哪个producerGroup发出的,即获取producerGroup值;

2、以producerGroup值从MQClientInstance.producerTable中获取MQProducerInner对象;

3、根据获取请求消息的渠道解析远程Broker的地址;

4、调用DefaultMQProducerImpl.checkTransactionState(String addr, MessageExt msg, CheckTransactionStateRequestHeader header)方法检查事务消息的状态。在该方法中初始化一个Runnable线程,然后将该线程放入线程池中,由该线程类处理相关逻辑:

4.1)获取DefaultMQProducerImpl对象的TransactionCheckListener

值,该值由应用层调用TransactionMQProducer.setTransactionCheckListener (TransactionCheckListener transactionCheckListener)方法设置;在应用层实现TransactionCheckListener接口的checkLocalTransactionState方法,该方法中检查本地的业务是否处理成功,根据处理结果来决定已发送到Broker的事务消息是应该提交还是回滚;该方法返回LocalTransactionState. ROLLBACK_MESSAGE或者LocalTransactionState.COMMIT_MESSAGE或LocalTransactionState.UNKNOW;

4.2)构建EndTransactionRequestHeader对象,该对象的fromTransactionCheck变量等于true、tranStateTableOffset变量等于收到到的消息的TranStateTableOffset值;若上一步返回LocalTransactionState. COMMIT_MESSAGE,则commitOrRollback值等于TransactionCommitType,若上一步返回LocalTransactionState. ROLLBACK_MESSAGE,则commitOrRollback值等于TransactionRollbackType;若上一步返回LocalTransactionState.UNKNOW,则commitOrRollback值等于TransactionNotType;

4.3)向发送CHECK_TRANSACTION_STATE请求码的Broker发送END_TRANSACTION请求码,将该事务消息的处理结果告知Broker;

3 创建Topic

在Broker的配置文件中可以设置autoCreateTopicEnable参数为false或true,该参数的用处:RocketMQ在发送消息时,会首先获取路由信息。如果是新的消息,由于MQServer上面还没有创建对应的Topic,这个时候,如果上面的配置打开的话,会返回默认TOPIC的(RocketMQ会在每台broker上面创建名为TBW102的TOPIC)路由信息,然后Producer会选择一台Broker发送消息,选中的broker在存储消息时,发现消息的topic还没有创建,就会自动创建topic。后果就是:以后所有该TOPIC的消息,都将发送到这台broker上,达不到负载均衡的目的。

所以建议关闭自动创建TOPIC的功能,即在配置文件中将autoCreateTopicEnable参数设置为false,然后有两种方式定义创建TOPIC:

1)在Broker中手工配置Topic,在启动Broker时会向NameServer注册,从而客户端就可以获取到为该topic提供服务的Broker地址信息;

2)在Producer发送消息之后,调用DefaultMQProducer.createTopic (String key, String newTopic, int queueNum)方法创建Topic。在该方法中key参数表示目前在Broker中已经存在的topic,通过该key值获取需要创建newTopic的一个Broker列表,然后在这些Broker上创建Topic。

DefaultMQProducer.createTopic (String key, String newTopic, int queueNum)方法的逻辑如下:

1)以key值参数调用MQClientAPIImpl.getTopicRouteInfoFromNameServer (String topic, long timeoutMillis)方法,其中timeoutMillis=3000,该方法向NameServer发送GET_ROUTEINTO_BY_TOPIC请求码获取topic参数对应的Broker信息和topic配置信息,即TopicRouteData对象;

2)遍历返回的TopicRouteData对象中包含的List<BrokerData>列表,向所有的主用Broker发送UPDATE_AND_CREATE_TOPIC请求消息;

原创粉丝点击