有序消息

在 Kafka 中,消息是以分区为单位进行存储的。分区是逻辑上的概念,用于对消息进行水平 划分和并行处理。每个 topic 都可以被划分为一个或多个分区,每个分区都是一个有序、不可变的消息日志。
Kafka 使用 WAL (write-ahead-log)日志来存储消息。每个分区都有一个对应的日志文件,新的消息会被追加到文件的末尾,而已经加入日志里的消息,就不会再被修改了。
每个消息在分区日志里都有一个唯一的偏移量(offset),用来标识消息在分区里的位置。Kafka 保证同一分区内的消息顺序,但不保证不同分区之间的顺序。

单分区

最简单的做法就是让特定的 topic 只有一个分区。这样所有的消息都发到同一个分区上,那么自然就是有序的。但是这个方案有一个很严重的问题:性能太差。因为你一个 topic 只有一个分区,它就没办法支撑高并发。

多分区

根据业务关键余数hash计算特定分区
多分区方案,这里你要记住多分区方案的两个缺陷,还有应对策略。RabbitMQ 和 RocketMQ 里面消息有序性的解法也是差不多的。不同的是,在 RabbitMQ里面使用的是 queue,因为 RabbitMQ 没有分区的概念。而 RocketMQ 里面内置了有序消息的功能,底层原理也基本相似。
  1. 数据不均匀。对应的解决方案是借鉴 Redis 的槽与槽分配的方案和一致性哈希方案。
  1. 增加分区引起的消息失序。要解决这个问题也很简单,就是新增加的分区暂时不要消费,确保在别的分区上的消息已经被消费完了再消费。

其他

RabbitMQ 和 RocketMQ 里面消息有序性的解法也是差不多的。不同的是,在 RabbitMQ里面使用的是 queue,因为 RabbitMQ 没有分区的概念。而 RocketMQ 里面内置了有序消息的功能,底层原理也基本相似。
notion image
多topic业务有序,通过前置校验,不合规数据重新丢入队列延迟处理,多次不合规告警手动介入
Loading...
目录
文章列表
王小扬博客
产品
Think
Git
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP