生产者方面
比如说我们建了一个 topic,有三个 partition。生产者在写的时候,其实可以指定一个 key,比如说我们指定了某个订单 id 作为 key,那么这个订单相关的数据,一定会被分发到同一个 partition 中去,而且这个 partition 中的数据一定是有顺序的
消费者方面
消费者从 partition 中取出来数据的时候,也一定是有顺序的。
单线程情况下可以保证消息消费的顺序,但是吞吐量比较低
多线程情况下比如有主子订单的情况下,子订单可能会被先处理,这样就出现了消息消费乱序的问题了<br>
解决方案
写 N 个内存 queue,具有相同 key 的数据都到同一个内存 queue;然后对于 N 个线程,每个线程分别消费一个内存 queue 即可,这样就能保证顺序性。
这里的可以实际上相对于生产者发送的这个key做了一个分组,对于客户端来说这N个queue就是中转了下kafka来的消息作为生产者,消费者内部重新起线程消费。简单来说就是一个多生产者多消费者模型