RocketMQ-Producer

rocketmq 发送端的设计
1、需要考虑什么?

容错设计

  • 如果投递到某个服务端失败了,在多主的情况下可以选择可用的服务端
  • 服务端不可用后要进入熔断状态,服务不可用还继续提供服务会带来一系列的问题
  • 服务端需要可以自动在熔断状态下恢复,服务可用但是长时间不能自动恢复

重试

  • 可配置的重试策略(重试策略,异步消息不存在重试的语义)
  • 重试支持选择新队列(在一个不可服务的队列上重试是一种资源的浪费,同时也是无效的重试)

2、消息投递需要的参数

  • topic

原则是:根据topic选择相应的逻辑队列,逻辑队列中相应的指定了broker, topic

3、rocketmq究竟怎么做?

3.1、TopicPublishInfo
这个数据结构保存的是该topic下的所有的逻辑队列List<MessageQueue>,以及本次发起请求时选择队列的下标值ThreadLocalIndex(index & messagequeues.size 才是真实的下标值)。
PS:这里有点绕,为何是保存所有的topic下的逻辑队列?而不是按照broker先分组,每个broker下再分逻辑队列呢?

3.2、FaultItem
这个数据结构保存着broker name, 以及对应的隔离时间,具体要看isAvailable()。该数据接口维系在faultItemTable这个Map中(ConncurrentHashMap,保证并发安全)

3.3、失败之后做了什么?

this.updateFaultItem(mq.getBrokerName(), endTimestamp - beginTimestampPrev, true); 

参数1是名称,参数2一次调用耗费的时间,参数2是是否隔离(隔离意味着熔断)

如果开启了容错保护机制,那么会根据是否隔离来计算broker的隔离时间。currentLatency + 30000 -> 并在notAvailableDuration = {0L, 0L, 30000L, 60000L, 120000L, 180000L, 600000L}这个数组中找到第一个大于该结果的值作为隔离的持续时间。

比如:currentLatency 0:30000,那么结果无疑就是60000,如果是30000:90000,那么结果就是120000,以此类推。所以隔离的持续时间其实是数组中的值。

PS: faultItem中记录的是隔离时间是:System.currentTimeMillis() + notAvailableDuration。而判断broker有效是:(System.currentTimeMillis() - startTimestamp) >= 0

3.4、选择队列的依据是什么?

随机下标(ThreadLocalIndex + 1), 以messagequeues.size作为循环次数,找到可用的broker(判断可用的依据是如上),如果找不到,则依据某个算法(随机打乱排序取二分之一位置的节点)在整个队列中选择一个队列(队列的id为随机值%broker可写队列长度)。

容错设计

1、第一次有地失败,并且该服务端被标记为隔离状态,时间参考notAvailableDuration值。
2、在这个持续时间内,该服务不会提供服务(运维这个时候需要去排查原因并重新启动)
3、超过该持续时间后,该节点会重新变为可用(但是不一定真实可用,如果不可用将会重新回到第1步)

重试

  • 配置项:retryTimesWhenSendFailed(默认2次),超过该次数将不再重试
  • 重试时将会按照上文说的策略进行筛选(ThreadLocalIndex对于当前线程有效地重试递增)

核心的代码包括:

DefaultMQProducerImpl#sendDefaultImpl()
DefaultMQProducerImpl#tryToFindTopicPublishInfo()
DefaultMQProducerImpl#selectOneMessageQueue()
DefaultMQProducerImpl#updateFaultItem()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容