消息队列作为服务/应用之间的通信中间件,可以起到业务耦合、广播消息、保证最终一致性以及错峰流控(克服短板瓶颈)等作用。本文不打算详细深入讲解消息队列,而是体系化的梳理消息队列可能涉及的技术点,起到提纲挈领的作用,构造一个宏观的概念,使用思维导图梳理。

再介绍之前,先简短比较下RPC和消息队列。RPC大多属于请求-应答模式,也包括越来越多响应式范式,对于需要点对点交互、强事务保证和延迟敏感的服务/应用之间的通信,RPC是优于消息队列的。那么消息队列(下文也简称MQ,即Message Queueu)可以看做是一种异步RPC,把一次RPC变为两次,进行内容转存,再在合适的时机投递出去。消息队列中间件往往是一个分布式系统,内部组件间的通信仍然会用到RPC。

目前开源界用的比较多的选型包括,ActiveMQ、RabbitMQ、Kafka、阿里巴巴的Notify、MetaQ、RocketMQ。下文的技术点梳理也是学习借鉴了这些开源组件,然后萃取出一些通用技术点。

关于消息队列的体系化认知,见下方的思维导图。

1. 整体架构

一般分为producer,broker,consumer三者。

2. RPC通信

详细参考《体系化认识RPC》(http://www.infoq.com/cn/artic...)。

3. 高性能保证

主要考虑MQ的延迟和吞吐。

高性能投递方面,分为producer和broker考虑。producer可以同步变异步、单条变批量保证发送端高性能,批量发送的触发条件可以分为buffer满或者时间窗口到了。broker可以进行多topic划分,再多分区/queue来进行分治(Divide and Conquer)策略,加大并行度,分散投递压力。另外broker对于需要持久化的消息,可以使用顺序IO,page cache,异步刷盘等技术提高性能,但是异步刷盘在掉电的情况下,可能会丢失数据,可以结合下面的高可用方案,在数据严格不丢和高性能吞吐之间做折中。

高性能消费,即consumer和broker通信,进行推、拉消息。使用consumer group水平扩展消费能力,需要按照业务场景使用分区有序或者无序消费。零拷贝技术节省broker端用户态到内核态的数据拷贝,直接从page cache发送到网络,从而最大化发送性能。consumer批量pull,broker批量push。broker端还可以做消息过滤,可通过tag或者插件实现。

4. 高可用保证

主要针对broker而言。

集群高可用,producer通过broker投递消息,所以必然有且仅有一个broker主负责“写”,选主策略分为自动选主和非主动选择,自动选主使用分布一致性组件完成,例如Kafka使用zookeeper,非自动选主,例如RocketMQ依赖多个无状态的name server。

数据高可用,针对broker持久化积压消息场景。可借助分布式存储完成,但是往往性能上是个短板,所以大多数主流产品都进行本地IO顺序写,进行主从备份,多副本拷贝保证可用性,例如RocketMQ分为同步双写和异步复制,前者像HDFS一样,写完多个副本再返回producer成功,有一定性能损失,但不大,后者最大化性能,但是当主挂的时候,数据有丢失风险。

同样,MQ集群也需要考虑跨机房高可用(非“异地多活”),broker的写高可用,要考虑最小化MTTR,同时不阻塞consumer消费。

5. 扩展性保证

采用分治(Divide and Conquer)策略,加大投递和消费的并行度,多个topic、多个分区/queue、多个副本、多个slave或者镜像。

6. 协议

producer、consumer和broker通信的协议,包括AMQP、STOMP、MQTT、HTTP、OpenWire(ActiveMQ)、XMPP、自定义等等。

AMQP是比较全面和复杂的一个协议,包括协议本身以及模型(broker、exchange、routing key等概念),目前RabbitMQ是AMQP消息队列最有名的开源实现,有非常多语言已经支持基于AMQP协议与消息队列通信,同时还可以通过插件支持STOMP、MQTT等协议接入。Kafka、RocketMQ均使用自定义的协议。

7. 消费关系

包括三种

1) 点对点,也就是P2P,FIFO的队列,可以看做单播。

2) Topic模式,Pub/Sub发布订阅。

3) fanout广播模式。

8. 消息堆积能力

持久化消息,如果存储在本地磁盘,可以使用同步刷盘和异步刷盘两种策略。磁盘不能无限堆积,会有清理策略,例如Kafka、RocketMQ都按照时间、数据量进行retention。

非持久化,仅放在内存,消费者处理完可选择删除掉。

9. 可靠投递

对于producer,从API和I/O层面可使用同步、异步,对于吞吐层面可使用单条、批量。fire-and-forget模式,类似UDP,尽管发送即可。针对可能发生的错误,例如连接broker失败,RPC超时、发布消息失败、发布后无响应,可选择忽略或者重发,所以往往重复投递的情况不可避免。

对于broker,如果要保证数据100%不丢,是可能的,但是需要牺牲下性能和吞吐,使用同步多写、多副本策略+同步刷盘持久化消息,可以严格保证不丢。另外,broker对于写入消息的payload,也会做完整性校验,例如CRC等。

10. 可靠消费

消费次数,包括at most once、at least once、exactly once,其中前两个比较好做到,最后的exactly once需要streaming consumer系统和broker端协作完成,例如storm的trident和flink。

推拉模式,push or pull。推模式最小化投递延迟,但是没有考虑consumer的承载能力,拉一般是轮询接收broker的数据,按照consumer自己的能力消费。

消费记录点,一般每个消息都有一个offset、ID或者时间戳,consumer可以按照这个offset来进行定点消费以及消息重放。

消息确认,consumer消费完成ACK回调broker或者集群高可用中间件(zk)通知消费进度。

错误处理,对于消费失败的情况,可以回复NACK,要求重发/requeue消息,当错误超多一定阈值时候,放到死信队列中。

消息重复消费,这和消费次数有关系,consumer在某些时候需要做到幂等性,保证重复消费不会引起业务异常。

11. 消息类型

顺序消息,有序的话,分为分区有序或者全局有序,前者可以按照某个业务ID取模,在发送端发到不同的分区/queue即可,后者往往需要单个队列才可以满足。无序消费则可最大化吞吐。

定时消息,事务消息,例如RocketMQ均支持。

12. 消息查询

目前RocketMQ支持消息根据msgId查询。

13. 生态融合

客户端语言的丰富性,与其他系统的集成度,例如Kafka和大数据技术栈融合很紧密,Spark、Storm、Flink、Kylin都有对应的connector。

14. 管理工具

分布式系统的管理是提高生产效率的必备保障,一个好的系统,如果周边工具不完善,对于使用者会很不友好,推广也会有困难。

对于消息队列,可以从topic管理、broker管理、集群管理、权限/配额管理、多租户、客户端工具、监控、报警、控制台Console UI来全方位进行治理。

作者:neoremind 出处:http://neoremind.com/2018/03/...


  • 分享一份阿里云内部超全K8s实战手册,免费下载!
  • 这里给大家再分享一些技术资料,建议收藏!
  • 超全96页!《阿里云ECS运维:linux系统诊断》手册开放免费下载
  • 升职加薪必备!运维工程师打怪升级进阶成神之路
  • 我没有开挂的人生!自律和坚持,是我走IT之路的唯一捷径
  • 全网最新、最全Linux面试题(2020版)!
  • 史上最全、最新的Redis面试题(2020最新版)!
  • 赞!7000 字学习笔记,MySQL 从入门到放弃
  • 12800字!SQL 语法速成手册(干货满满,建议收藏!)

如有错误或其它问题,欢迎小伙伴留言评论、指正。如有帮助,欢迎点赞+转发分享。

更多相关开源技术文章,请持续关注民工哥知乎技术专栏。

我是民工哥,一个爱折腾的IT技术老司机,欢迎关注我,我们一起学习,共同成长!!

消息队列 策略_消息队列技术点梳理(思维导图版)相关推荐

  1. 消息队列 策略_消息模型:主题和队列有什么区别?

    首发公众号 可以看到,技术圈的风向一直在变,大数据.云的热度已经在慢慢消退,现在当红的是 AI 和 IoT.这些火热的概念,它最终要从论文和 PPT 落地,变成真正能解决问题的系统,否则就是一个空中楼 ...

  2. 消息队列 策略_太狠了!京东T8架构师建议吃透这40W字消息队列文档,涨薪15K不是梦...

    "RabbitMQ?""Kafka?""RocketMQ?"...在日常学习与开发过程中,我们常常听到消息队列这个关键词.我也在我的多篇文章 ...

  3. mfc 消息消息队列概念_消息队列面试连环问

    最近我一直扎在消息队列实现细节之中无法自拔,已经写了 3 篇Kafka源码分析,还剩很多没肝完.之前还存着RocketMQ源码分析还没整理.今儿暂时先跳出来盘一盘大方向上的消息队列有哪些核心注意点. ...

  4. [RabbitMQ]消息应答概念_消息手动应答代码

    消息应答 概念 消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成了部分突然它挂掉了,会发生什么情况.RabbitMQ 一旦向消费者传递了一条消息,便立即将该消 息标记为 ...

  5. @override怎么加上去_不知道怎么学?java后端5年经验和技术总结(附思维导图)

    1.引言 今天的光棍节,经历了昨晚的疯狂之后,看着后台数据逐渐的趋于平稳,突然感觉身心疲惫,躺在椅子上,看着媳妇给我发的消息,同学群里在疯狂讨论昨晚的疯狂操作,身边的年轻人换了一批又一批,回想自己,毕 ...

  6. 关于.NET技术体系的思维导图

    对不起被骗进来的各位,实在有点标题党 最近要为学弟们弄点东西,主要是介绍方面的,我弄了一个思维导图,想以这些方面展开.但是想法并不成熟,所以在这里想征集一下大家的意见. 1.可以帮助我完善这个图 2. ...

  7. 嵌套 思维导图_工作小Tips:如何用思维导图来整理你的汇报

    自认为自己属于思维导图的重度用户,同时有一个很强烈的观点:能用图表来呈现的,坚决不用文字,能用一句话说明白的,坚决不用两句话! 基于此,当有一个很大的文档(一般 100 页以上)或是一本很好的书,都会 ...

  8. rocketmq技术内幕 pdf_618买什么也别忘了买书!精选100+本技术好书和思维导图,建议收藏!...

    点击蓝色"程序员书单"关注我哟加个"星标",每天带你读好书! 欢迎将公众号[程序员书单]公众号置顶,技术干货第一时间送达! 本公众号专注于IT技术,致力于为程序 ...

  9. 初中 昆虫记思维导图_《昆虫记》的思维导图

    一. 俯览全貌 思维导图的首要策略,就是先对素材做全面了解. 正如做身体检查,要先做个X光片一样,医生要对你的整个身体做一次通盘性的观察. 想象一下自己是一只遨翔云端.鸟瞰非洲大草原上的老鹰,你拥有锐 ...

最新文章

  1. 北航孙钰:昆虫目标检测技术
  2. 2007 China MVP Open Day
  3. struts2配置的ajax参数传递方法
  4. 博士申请 | 北京理工大学张睿恒老师组招收计算机视觉方向硕士/博士生
  5. why xml sucks
  6. 您在eXo平台上的第一个Juzu Portlet
  7. 电子商务概论_走进经管优质线上课堂(二)之电子商务概论
  8. 常用 html 标签
  9. 操作自定义属性、H5自定义属性
  10. Intouch通过ODBC连接MySQL
  11. 整理的Android资源代码 源码 整理 Github开源项目下载地址
  12. 知乎上看到的关于异步双核的解释
  13. TJUPT 无法与服务器建立连接问题的解决方法
  14. redis实现图形验证码的存储和验证
  15. 想要做大事,就要有高效的协作机制
  16. 使用移动云MAS HTTP接口发送短信BASE64加密中文乱码
  17. 如何用java取对数_使用Java中的Math.log获取自然对数值
  18. 交通领域主要SCI期刊——2017年JCR
  19. 图深度学习——卷积神经网络循环神经网络自编码器
  20. win7 sp2 好神奇

热门文章

  1. PAT甲级1048 Find Coins :[C++题解]哈希表、两个硬币之和为定值
  2. 2020年高等数学方法与提高(上海理工大学)学习笔记:无穷级数
  3. php新增数组函数,php操作数组函数
  4. python凯撒密码加密写入文件_Python用户名密码登录系统(MD5加密并存入文件,三次输入错误将被锁定)及对字符串进行凯撒密码加解密操作...
  5. 释放skb buffer指针引出的指针传递问题
  6. 安卓四大组件之Service
  7. linux项目变量存放,linux 堆、栈、全局变量存放
  8. java 判断 年份,java怎么判断指定年份是否是闰年
  9. java中的me关键字_java中的volatile关键字
  10. QMouseEvent