RabbitMQ在3.9版本引入了一种新的队列类型Stream Queue,它与当前的 Classic(经典) 队列不同,消息被消费后不会被自动删除,像Kafka一样,消息会继续驻留在队列中。当一个队列需要被多个应用系统(的消费者)订阅时,以往的方式,总是使用fanout类型的exchange,将消息广播到多个队列中,每个队列对应一个应用系统(的消费者)。而Stream队列打破了这种方式,一个队列可以被多个应用系统(的消费者)反复使用。"反复"的意思不仅是指它能同时被多个应用系统(的消费者)访问,也是指消费者可以从队列的任意位置开始访问消息。消费者只要指定"x-stream-offset"参数,就可以回到队列的指定位置,好像按了重播按钮一样,重新消费数据。 Stream 队列是以吞吐量为主要设计目标,以追加日志的方式存储到磁盘的。因此,Stream队列默认就是持久化的,消息直接存储在磁盘上,在消费者读取消息之前,它不会占用任何内存。也就是说它是以最小的内存开销来存储大量消息日志的。另外,为了避免Stream队列占满磁盘空间,可以设置队列日志数据的最大磁盘空间,或消息的"最大生命周期"(丢弃日志中最久的消息)。 有所得必有所失,Stream 队列使用的是非破坏性读取语义(消费完不会自动删除消息),所以Classic队列的许多特性它是不支持的。比如说不支持TTL、不支持消息和消费者的优先级,不支持死信exchange等。 Stream 的应用场景还是挺多的,比如存储交易流水,设备监测数据等等。RabbitMQ 一直是支持MQTT的,现在随着 Stream queue 队列的出现,对物联网场景的支撑会更丰富。