5、容错处理

当处理消息,队列和事件时,开发者常常认为消息处理总是成功的。毕竟,生产者把每条消息放入队列或者主题后,即使消费者处理消息失败了,它仅仅需要做的就是重新尝试,直到成功为止。

尽管表面上看这种方法是没错的,但是我们应该对这种处理方式多思考一下。首先我们应该承认,在某些场景下,消息处理会失败。所以,即使在解决方案部分需要人为干预的情况下,我们也要妥善地处理这些情况。

消息处理存在两种可能的故障:

1)瞬时故障——故障产生是由于临时问题导致,比如网络连接,CPU负载,或者服务崩溃。我们可以通过一遍又一遍的尝试来减轻这种故障。

2)持久故障——故障产生是由于永久的问题导致的,并且这种问题不能通过额外的重试来解决。比如常见的原因有软件bug或者无效的消息格式(例如,损坏(poison)的消息)。

应该问问自己:“对于消息处理故障,我们应该重试多少次?每一次重试之间我们应该等多久?我们怎样区分瞬时和持久故障?”

最重要的是:“所有重试都失败后或者遇到一个持久的故障,我们要做什么?”

当然,不同业务领域有不同的回答,消息系统一般会给我们提供工具让我们自己实现解决方案。

RabbitMQ会给我们提供诸如交付重试和死信交换器(DLX)来处理消息处理故障。

DLX的主要思路是根据合适的配置信息自动地把路由失败的消息发送到DLX,并且在交换器上根据规则来进一步的处理,比如异常重试,重试计数以及发送到“人为干预”的队列

在RabbitMQ中我们需要记住最重要的事情是当一个消费者正在处理或者重试某个消息时(即使是在把它返回队列之前),其他消费者都可以并发的处理这个消息之后的其他消息。

当某个消费者在重试处理某条消息时,作为一个整体的消息处理逻辑不会被阻塞。所以,一个消费者可以同步地去重试处理一条消息,不管花费多长时间都不会影响整个系统的运行。

消费者1持续的在重试处理消息1,同时其他消费者可以继续处理其他消息

和RabbitMQ相反,Kafka没有提供这种开箱即用的机制。在Kafka中,需要我们自己在应用层提供和实现消息重试机制。

另外,我们需要注意的是当一个消费者正在同步地处理一个特定的消息时,那么同在这个分区上的其他消息是没法被处理的。

由于消费者不能改变消息的顺序,所以我们不能够拒绝和重试一个特定的消息以及提交一个在这个消息之后的消息。你只要记住,分区仅仅是一个追加模式的日志。

一个应用层解决方案可以把失败的消息提交到一个“重试主题”,并且从那个主题中处理重试;但是这样的话我们就会丢失消息的顺序。

我们可以在http://Uber.com上找到Uber工程师实现的一个例子。如果消息处理的时延不是关注点,那么对错误有足够监控的Kafka方案可能就足够了。

如果消费者阻塞在重试一个消息上,那么底部分区的消息就不会被处理

获胜者:

RabbitMQ是获胜者,因为它提供了一个解决这个问题的开箱即用的机制。

需要更多教程,微信扫码即可

RabbitMQ和Kafka的显著差异(5)相关推荐

  1. RabbitMQ和Kafka的显著差异(6)

    6.伸缩 有多个基准测试,用于检查RabbitMQ和Kafka的性能. 尽管通用的基准测试对一些特定的情况会有限制,但是Kafka通常被认为比RabbitMQ有更优越的性能. Kafka使用顺序磁盘I ...

  2. RabbitMQ和Kafka的显著差异(1)

    RabbitMQ是一个消息代理,但是Apache Kafka是一个分布式流式系统.好像从语义上就可以看出差异,但是它们内部的一些特性会影响到我们是否能够很好的设计各种用例. 例如,Kafka最适用于数 ...

  3. RabbitMQ和Kafka的显著差异(over)

    7.消费者复杂度 RabbitMQ使用的是智能代理和傻瓜式消费者模式.消费者注册到消费者队列,然后RabbitMQ把传进来的消息推送给消费者.RabbitMQ也有拉取(pull)API:不过,一般很少 ...

  4. RabbitMQ和Kafka的显著差异(4)

    4.消息留存(retention) 当消费者成功消费消息之后,RabbitMQ就会把对应的消息从存储中删除.这种行为没法修改.它几乎是所有消息代理设计的必备部分. 相反,Kafka会给每个主题配置超时 ...

  5. RabbitMQ和Kafka的显著差异(3)

    3.消息时序(timing) 在测定发送到一个队列的消息时间方面,RabbitMQ提供了多种能力: 1)消息存活时间(TTL) 发送到RabbitMQ的每条消息都可以关联一个TTL属性.发布者可以直接 ...

  6. RabbitMQ和Kafka的显著差异(2)

    2.消息路由 RabbitMQ可以基于定义的订阅者路由规则路由消息给一个消息交换器上的订阅者.一个主题交换器可以通过一个叫做routing_key的特定头来路由消息. 或者,一个头部(headers) ...

  7. rabbitmq中默认unack超时时间_RabbitMQ 与 Kafka 的技术差异以及使用注意点

    导言 作为一个有丰富经验的微服务系统架构师,经常有人问我,"应该选择RabbitMQ还是Kafka?".基于某些原因, 许多开发者会把这两种技术当做等价的来看待.的确,在一些案例场 ...

  8. kafka reassign 限速_RabbitMQ 与 Kafka 的技术差异以及使用注意点

    导言 作为一个有丰富经验的微服务系统架构师,经常有人问我,"应该选择RabbitMQ还是Kafka?".基于某些原因, 许多开发者会把这两种技术当做等价的来看待.的确,在一些案例场 ...

  9. RabbitMQ和Kafka选型用哪个

    作为一个有丰富经验的微服务系统架构师,经常有人问我,"应该选择RabbitMQ还是Kafka?" 基于某些原因, 许多开发者会把这两种技术当做等价的来看待.的确,在一些案例场景下选 ...

最新文章

  1. Fast ORB-SLAM
  2. “未来已来,共赢未来!” -- 我眼中的Citrix Summit 2017 - Part 2
  3. winlogon.exe错误:小心设置搜狗拼音输入法
  4. JAVA数据类型与逻辑练习
  5. Python基础教程:对象及数字对象与数学运算
  6. 一行 Python 代码制作七夕节爱心
  7. windows组件中没有IIS解决方法
  8. VTK:图表之CreateTree
  9. linux电脑系统投到电视,教你如何在Linux操作系统下观看电视节目
  10. php 一天只能点赞上一次,ThinkPHP3.2 实现浏览量和点赞量,每次访问页面浏览量+1以及每个登录用户只能对同一篇文章点赞一次-Go语言中文社区...
  11. 树莓派SSH 连接不上:socket error Event:32 Error:10053
  12. VisualCode 查看代码历史版本、还原代码到既定历史版本
  13. 使用matlab读取excel数据并保存
  14. 前端FISH框架学习笔记
  15. 学习方法推荐——番茄工作法
  16. 一直播、小咖秀大数据自动化运维实践
  17. 图片怎么做gif?如何让图片变GIF动图?
  18. 干货 | 4步带你完成私有云盘搭建
  19. 动态壁纸安卓_酷玩软件第7期:还在用无声的动态壁纸?短视频壁纸软件(Win+安卓版本)...
  20. 浅谈mysql的执行计划是何方神圣

热门文章

  1. 拼多多:有营销号“骗粉博出位” 将用法律武器维权
  2. 中国制造特斯拉亮相 中文车尾标亮了!网友:好抠吗?
  3. 骁龙865确定:年底发布 支持5G!
  4. 斗鱼上市进行时:将登陆纳斯达克 发行价区间定为11.5至14美元
  5. 神操作!员工索要工资遭遇“假转账”:转了生气又撤销
  6. 年度旗舰机广告片遭电视台泄露 三星:我有句话不知当讲不当讲
  7. Java并发编程之Semaphore信号量
  8. 红黑树的java实现
  9. linux pxe安装视频,Linux—图解PXE实现全自动安装系统(1)
  10. 4 相机切换_景明促销IIVlog小新机 索尼Vlog相机ZV1