RabbitMQ 3.9 引入了一种新型数据结构:流。Streams 解锁了一组用例,使用“传统”队列实现这些用例可能很乏味。让我们在这篇文章中发现流如何扩展 RabbitMQ 的功能。
RabbitMQ 流使用非破坏性消费语义对仅附加日志进行建模。这意味着——与 RabbitMQ 中的传统队列相反——从流中消费不会删除消息。
RabbitMQ 中的流是持久化和复制的。这转化为数据安全性和可用性(在节点丢失的情况下),以及扩展(从不同节点读取相同的流)。
与非常通用的队列相比,流看起来有点固执己见,但它们在一组用例中派上用场。它们以一种非常好的方式扩展了 RabbitMQ 的功能。
RabbitMQ Streams 在以下用例中大放异彩:
- 大扇出:许多应用程序需要读取相同的消息(对于传统队列,这将需要为每个应用程序声明一个队列并将相同消息的副本传递给每个应用程序)
- 大积压:流将消息存储在磁盘上,而不是内存中,因此唯一的限制是磁盘容量
- 重放和时间旅行:消费者可以使用绝对偏移量或时间戳附加流中的任何位置,并且他们可以读取和重新读取相同的数据
- 高吞吐量:与传统队列相比,流速度超快,快几个数量级
由于流作为RabbitMQ 3.9 中的核心插件发布,您可以将它们与所有现有的 RabbitMQ 功能一起使用。
更具体地了解流:
- 由于发布者确认和发布者端的消息重复数据删除,流提供至少一次保证。
- 流支持服务器端偏移跟踪,让消费者从他们离开的地方重新开始。
- 由于流具有非破坏性语义,因此它们可以增长很多。RabbitMQ Streams 可以根据保留策略,基于大小或年龄自动截断流。
- 流可以通过专用的、极快的二进制协议和 AMQP 0.9.1 & 1.0(快速)访问。
- 由于RabbitMQ 3.9 的核心发行版中附带的流插件,流协议是可访问的。
- RabbitMQ Streams 支持客户端-服务器 TLS。
- 可以使用现代的、高度优化的Java 客户端。它使用流协议以获得更好的性能。它是完整的文档。
- 一个Go客户端是可用的。
- 还有一个基于Java客户端的性能工具。是的,它以Docker 镜像的形式出现。