消息队列简记| 青训营笔记

165 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记

仅仅为个人理解及记录,无法保证绝对的正确性,如果错误欢迎指出。欢迎交流讨论。

消息队列提供了一种生产者消费者模型。可以认为它有顺序读写的功能。 消息队列可以实现如下的一些经典模式。

  • 异步、解耦:消息队列是中介者模式和观察者模式的结合。可以把自身多个对其他依赖的调用交给消息队列,让消息队列做相关的操作,同时这也实现了降低耦合度的功能。
  • 削峰:由于顺序读写之类等原因,实际上它可以保证比较高的吞吐量(high throughput)。

最经典的队列就是以吞吐量著称的大名鼎鼎的卡夫卡了。 在Kafka的具体使用中,Topic 即是使用中的所谓队列,消费者和生产者相互处理。 其中的消息是通过Offset表示,同时由于这个东西的存在也可以保证消息的唯一性。客户端查找数据时是通过offset二分查询。 为了保证可靠存储Kafka使用了复制机制,这在其中被称为replica。


具体到写入消息,为了提高吞吐量,kafka和大部分流式系统一样提供了pipeline机制,批量传输数据。 由于一次传输的消息更大了,因此压缩发送是比较自然的想法。 对于服务端而言,卡夫卡还需要将数据通过一些特殊的设计实现其他的功能特性。 比如先前说的replica,副本就意味着复制,老版本通过zookeeper达成共识,新版可以通过所谓的kraft(尽管还没有大规模应用)。单单这一点会带来许多问题。例如扩容时新节点对数据的复制,leader下线等等,属于分布式的经典问题。


另一个消息队列的代表是业务常用的RocketMQ,架构上听说是参考了kafka,然后用Java重写的,所以对比而言有较多的相似之处,提供了比较好用的高级特性。

  • 事务:类似于数据库的事务,让MQ的功能进一步增强,另一方面,有了事务的保证可以和其他数据系统事务机制共同用于实现分布式事务。
  • **延迟发送:**各种定时、延时消息好帮手,提供了可靠的基础定时能力。