消息分类
在消息队列中,根据消息的特性及使用场景,可以将消息作如下分类:
消息类型 | 消费顺序 | 性能 | 适用场景 |
普通消息 | 无顺序 | 最好 | 吞吐量巨大,且对生产和消费顺序无要求 |
局部顺序消息 | 同一分区下所有消息遵循先入先出(FIFO)规则 | 较好 | 吞吐量较大,同一分区内有序,不同分区内无序 |
全局顺序消息 | 同一 Topic 下所有消息遵循先入先出(FIFO)规则 | 一般 | 吞吐量一般,全局有序,单分区 |
死信消息 | - | - | 无法正常消费的消息 |
定时消息 | 消息在发送至服务端后,推迟到某个时间点被消费 | 存在1秒左右误差 | 在某个指定时间点进行消息的消费 |
延时消息 | 消息在发送至服务端后,推迟一段时间后再被消费 | 存在1秒左右误差 | 在指定的时间间隔后进行消息消费 |
普通消息
普通消息是一种基础的消息类型,由生产投递到指定 Topic 后,被订阅了该 Topic 的消费者所消费。普通消息的 Topic 中无顺序的概念,可以使用多个分区数来提升消息的生产和消费效率,在吞吐量巨大时其性能最好。
局部顺序消息
局部顺序消息相较于普通消息类型,多了一个局部有顺序的特性。即同一个分区下,其消费者在消费消息的时候,严格按照生产者投递到该分区的顺序进行消费。局部顺序消息在保证了一定顺序性的同时,保留了分区机制提升性能。但局部顺序消息不能保证不同分区之间的顺序。
全局顺序消息
全局顺序消息最大的特性就在于,严格保证消息是按照生产者投递的顺序来消费的。所以其使用的是单分区来处理消息,用户不可自定义分区数,相比前两种消息类型,这种类型消息的性能较低。
死信消息
死信消息是指无法被正常消费的消息。TDMQ Pulsar 版会在创建新的订阅(消费者确定了与某个 Topic 的订阅关系)时自动创建一个死信队列用于处理这种消息。
定时消息
消息在发送至服务端后,实际业务并不希望消费端马上收到这条消息,而是推迟到某个时间点被消费,这类消息统称为定时消息,可以看成是延时消息的一种特殊用法,其实现的最终效果与延时消息一致。
延时消息
消息在发送至服务端后,实际业务并不希望消费端马上收到这条消息,而是推迟一段时间后再被消费,这类消息统称为延时消息。
重试队列
重试队列是一种为了确保消息被正常消费而设计的队列。当某些消息第一次被消费者消费后,没有得到正常的回应,则会进入重试队列,当重试达到一定次数后,停止重试,投递到死信队列中。
由于实际场景中,可能会存在的一些临时短暂的问题(如网络抖动、服务重启等)导致消息无法及时被处理,但短暂时间过后又恢复正常。这种场景下,重试队列的重试机制就可以很好解决此类问题。
死信队列
死信队列是一种特殊的消息队列,用于集中处理无法被正常消费的消息的队列。当消息在重试队列中达到一定重试次数后仍未能被正常消费,TDMQ Pulsar 版会判定这条消息在当前情况下无法被消费,将其投递至死信队列。
实际场景中,消息可能会由于持续一段时间的服务宕机,网络断连而无法被消费。这种场景下,消息不会被立刻丢弃,死信队列会对这种消息进行较为长期的持久化,用户可以在找到对应解决方案后,创建消费者订阅死信队列。