RocketMQ(三)RocketMQ怎么保证的消息不丢失?.pdfVIP

RocketMQ(三)RocketMQ怎么保证的消息不丢失?.pdf

  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文档。上传文档
查看更多
RocketMQ (三)RocketMQ怎么保证的消息不丢失? ⼀、消息发送过程 我们将消息流程分为如下三⼤部分,每⼀部分都有可能会丢失数据。 ⽣产阶段:Producer通过⽹络将消息发送给Broker,这个发送可能会发⽣丢失,⽐如⽹络延迟不可达等。 存储阶段:Broker肯定是先把消息放到内存的,然后根据刷盘策略持久化到硬盘中,刚收到Producer的消息,再内存中了,但是异常宕机了,导致消息丢失。 消费阶段:消费失败了其实也是消息丢失的⼀种变体吧。 ⼆、Producer⽣产阶段 Producer通过⽹络将消息发送给Broker,这个发送可能会发⽣丢失,⽐如⽹络延迟不可达等。 1、解决⽅案⼀ 1.1、说明 有三种send⽅法,同步发送、异步发送、单向发送。我们可以采取同步发送的⽅式进⾏发送消息,发消息的时候会同步阻塞等待broker返回的结果,如果没成功,则不会收到 SendResult ,这种是最可靠的。其次是异步发送,再回调⽅法⾥可以得知是否发送成功。单向发送(OneWay)是最不靠谱的⼀种发送⽅式,我们⽆法保证消息真正可达。 1.2、源码 /** * {@link org.apache.rocketmq.client.producer.DefaultMQProducer} */ // 同步发送 public SendResult send(Message msg) throws MQClientException, RemotingException, MQBrokerException, InterruptedException {} // 异步发送,sendCallback作为回调 public void send(Message msg,SendCallback sendCallback) throws MQClientException, RemotingException, InterruptedException {} // 单向发送,不关⼼发送结果,最不靠谱 public void sendOneway(Message msg) throws MQClientException, RemotingException, InterruptedException {} 2、解决⽅案⼆ 2.1、说明 发送消息如果失败或者超时了,则会⾃动重试。默认是重试三次,可以根据api进⾏更改,⽐如改为10次: producer.setRetryTimesWhenSendFailed(10); 2.2、源码 /** * {@link org.apache.rocketmq.client.producer.DefaultMQProducer#sendDefaultImpl(Message, CommunicationMode, SendCallback, long)} */ // ⾃动重试次数,this.defaultMQProducer.getRetryTimesWhenSendFailed()默认为2,如果是同步发送,默认重试3次,否则重试1次 int timesTotal = communicationMode == CommunicationMode.SYNC ? 1 + this .defaultMQProducer.getRetryTimesWhenSendFailed() : 1; int times = 0; for (; times timesTotal; times++) { // 选择发送的消息queue MessageQueue mqSelected = this .selectOneMessageQueue(topicPublishInfo, lastBrokerName); if (mqSelected != null) { try { // 真正的发送逻辑,sendKernelImpl。 sendResult = this .sendKernelImpl(msg, mq, communicationMode, sendCallback, topicPublishInfo, timeout - costTime); switc (communicationMode) { case ASYNC: return

文档评论(0)

文库垃圾佬 + 关注
实名认证
文档贡献者

这个人很懒

1亿VIP精品文档

相关文档