RabbitMQ_的Confirm机制优化.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
RabbitMQ_的Confirm机制优化

RabbitMQ 的Confirm机制优化背景:RabbitMQ的confirm是于生产者与MQ之间的确认机制,确保消息确实投递到了MQ。在许多对可靠性要求比较高的应用场景下都需要使用该机制确保消息不丢。测试显示,该功能开启与否对性能影响很大,在单台服务器上开8个queue,消息持久化,1kb大小的消息,不开confirm 时QPS 28k,开启confirm后QPS降到21k。源码分析:开启confirm后,生产者与RabbitMQ之间通过发送确认序号来对消息进行确认,该序号是per channel的。对消息进行确认就是简单的将该消息对应的序号发回给生产者,但RabbitMQ收到消息后并不是立即回ack,在不同配置下,回ack的时机是不同的。Confirm的过程伴随着消息在MQ中整个处理流程,为此接下来我们从整个消息的生命周期来分析confirm的处理机制。以下是confirm机制的主干流程。Rabbit_channel 接收到新消息后根据路由规则确定该消息应该被投递给哪些queue, 为每个消息生成一个全局唯一标识msgid,当然每个消息也有per channel的确认序号,后面还会有别的序号,为了避免冲突我们将该确认序号命名为ch_seq_no。在将该消息以及对应的msgid,ch_seq_no投递给相应queue进程后,记录下unconfirmed消息。dtree:insert(MsgSeqNo, QPids, XName,State#ch.unconfirmed)}.Rabbit_amqqueue_process收到信息以后记录为未确认的消息maybe_record_confirm_message({eventually, SenderPid, MsgSeqNo, MsgId}, State = #q{msg_id_to_channel = MTC}) - State#q{msg_id_to_channel = gb_trees:insert(MsgId, {SenderPid, MsgSeqNo}, MTC)};其中MsgId是消息的全局唯一表示,SenderPid是接收该消息的channel进程,MsgSeqNo是该消息的确认序号。(2)交给backing_queue做持久化3. backing_queue收到新消息后(1)记录为未确认的消息 UC1 = gb_sets_maybe_insert(NeedsConfirming, MsgId, UC), (2)将消息投递给rabbit_msg_store4. rabbit_msg_store收到新消息后(1)记录为未确认的消息record_pending_confirm(CRef, MsgId, State) - update_pending_confirms( fun (_MsgOnDiskFun, CTM) - dict:update(CRef, fun (MsgIds) - gb_sets:add(MsgId, MsgIds) end, gb_sets:singleton(MsgId), CTM) end, CRef, State).(2)定期或者在切换消息存储文件时,对消息进行确认internal_sync(State = #msstate { current_file_handle = CurHdl, cref_to_msg_ids = CTM }) - State1 = stop_sync_timer(State), CGs = dict:fold(fun (CRef, MsgIds, NS) - case gb_sets:is_empty(MsgIds) of true - NS; false - [{CRef, MsgIds} | NS] end end, [], CTM), ok = case CGs of [] - ok; _ - file_handle_cache:sync(CurHdl) end, lists:foldl(fun ({CRef, MsgIds}, StateN) - client_confirm(CRef, MsgIds, written, StateN) end, State1, CGs).client_confirm(CRef, MsgIds, ActionTaken, State) - update_pending_confirms( fun (MsgOnDiskFun, CTM) - case dict:find(CRef, CTM) of {ok, Gs} - MsgOnDiskFun(gb_sets:intersection(Gs, MsgIds), ActionTaken), MsgIds1 = rabbi

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档