rocketmq3.26研究之Failover下producer的表现
2016-02-14 17:35
435 查看
1 环境如下:
说明:
producer默认会依次轮询 broker_a-q0,broker_a-q1,broker_a-q2,broker_a-q3,broker_b-q0,broker_b--q1,broker_b-q2,broker_b-q3 进行消息发送。
这个对应关系列表暂时称作 topic路由,下面会用到该词语。
2 消息发送流程:
每次发送消息都需要知道此次发往的borker的master地址及queue id,故下面的流程图就是获取这两个信息的流程:说明:
1 默认调用send方法进行发送
2.1 调用其实现类中的sendDefaultImpl进行发送
2.2 根据topic从本地map(topicPublishInfoTable)中获取topic路由.
3 第一次本地map中是获取不到的,故需要从name server中获取
4 从name server查询关系
5 更新到本地map中
3 failover表现:
3.1 假设现在把broker_b的master kill掉,producer端会抛出如下异常:2015-08-10 12:04:15,090 [pool-1-thread-1] WARN RocketmqClient - sendKernelImpl exception
com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to <10.10.81.94:10915> failed
at com.alibaba.rocketmq.remoting.netty.NettyRemotingClient.invokeSync(NettyRemotingClient.java:641) ~[classes/:na]
at com.alibaba.rocketmq.client.impl.MQClientAPIImpl.sendMessageSync(MQClientAPIImpl.java:306) ~[classes/:na]
at com.alibaba.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:289) ~[classes/:na]
at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendKernelImpl(DefaultMQProducerImpl.java:679)
[classes/:na]
at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:500)
[classes/:na]
at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1031)
[classes/:na]
at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1025)
[classes/:na]
at com.alibaba.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:95) [classes/:na]
at com.sohu.index.tv.mq.rocketmq.ProducerRocketMQ.publish(ProducerRocketMQ.java:60) [classes/:na]
此时,由于无法连接broker,消息发送失败。
3.2 定时任务
producer默认会启动定时任务MQClientInstance.this.updateTopicRouteInfoFromNameServer()
其作用是默认每隔30s从name server查询producer对应的topic路由,并更新到DefaultMQProducerImpl.topicPublishInfoTable中。
由于broker_b挂掉,故只会获取到broker_b的slave的地址(假设有slave),而slave最终会被如下代码过滤掉:
MQClientInstance.topicRouteData2TopicPublishInfo
if (!brokerData.getBrokerAddrs().containsKey(MixAll.MASTER_ID)) {
continue;
}
所以最终结论,broker_b相关的queue的对应关系会移除掉,最终的结果是只往broker_a发送消息。
相关文章推荐
- HttpClient连接池抛出大量ConnectionPoolTimeoutException: Timeout waiting for connection异常排查
- poj 3411 Paid Roads(DFS)
- ORA-12012: error on auto execute of job “SYS”.”BSLN_MAINTAIN_STATS_JOB”
- 硬件访问服务AIDL HAL
- switchover和failover
- Raid的一些记录
- 硬件访问服务AIDL JNI 方式
- POJ 1422 Air Raid(DAG最小路径覆盖)
- 多线程 -- sleep()方法和wait()方法区别
- leetcode Climbing Stairs
- Wear:onConnectionFailed: ConnectionResult{statusCode=SERVICE_MISSING, resolution=null, message=null}
- Email 格式验证的正则表达式
- usaco training 1.3奶牛回文
- LeetCode 70. Climbing Stairs
- hdu 1239 Calling Extraterrestrial Intelligence Again
- CodeForces 159D Palindrome pairs(manacher)
- HDU-1021-Fibonacci Again ( 找规律 + Fibonacci )
- Rails Error
- Codeforces Round #338 (Div. 2) B. Longtail Hedgehog
- UVa--514 Rails (stack)