有序消息
在 Kafka 中,消息是以分区为单位进行存储的。分区是逻辑上的概念,用于对消息进行水平
划分和并行处理。每个 topic 都可以被划分为一个或多个分区,每个分区都是一个有序、不可变的消息日志。
Kafka 使用 WAL (write-ahead-log)日志来存储消息。每个分区都有一个对应的日志文件,新的消息会被追加到文件的末尾,而已经加入日志里的消息,就不会再被修改了。
每个消息在分区日志里都有一个唯一的偏移量(offset),用来标识消息在分区里的位置。Kafka 保证同一分区内的消息顺序,但不保证不同分区之间的顺序。
单分区
最简单的做法就是让特定的 topic 只有一个分区。这样所有的消息都发到同一个分区上,那么自然就是有序的。但是这个方案有一个很严重的问题:性能太差。因为你一个 topic 只有一个分区,它就没办法支撑高并发。
多分区
根据业务关键余数hash计算特定分区
多分区方案,这里你要记住多分区方案的两个缺陷,还有应对策略。RabbitMQ 和 RocketMQ 里面消息有序性的解法也是差不多的。不同的是,在 RabbitMQ里面使用的是 queue,因为 RabbitMQ 没有分区的概念。而 RocketMQ 里面内置了有序消息的功能,底层原理也基本相似。
- 数据不均匀。对应的解决方案是借鉴 Redis 的槽与槽分配的方案和一致性哈希方案。
- 增加分区引起的消息失序。要解决这个问题也很简单,就是新增加的分区暂时不要消费,确保在别的分区上的消息已经被消费完了再消费。
其他
RabbitMQ 和 RocketMQ 里面消息有序性的解法也是差不多的。不同的是,在 RabbitMQ里面使用的是 queue,因为 RabbitMQ 没有分区的概念。而 RocketMQ 里面内置了有序消息的功能,底层原理也基本相似。
多topic业务有序,通过前置校验,不合规数据重新丢入队列延迟处理,多次不合规告警手动介入
Loading...