Kafka消息的顺序消费

上文中,我们说到了关于Kafka消息丢失和消息重复消费的问题,但不知道小伙伴们有没有遇到这样的应用场景,在并发量过大,生产者生产消息的速度过大,消费者端消费速度太慢,导致消息不能得到"实时"消费,而且消息的过多堆积也有可能对Broker端的持久化造成很大影响,一般为了提高消费者的消费速度,第一个想到的应该就是开启多个线程来进行消息消费了,但这又会导致一个很棘手的问题,那就是在多线程的环境下,消息的消费顺序是得不保证的,哎,一个问题解决了反而又带来了一个更大的问题,头大,小伙伴们莫急,现在我就来给大家一起解决和分析这个问题,go。

1.消费者和消费者组

首先我们要先了解一下消费者端的消费模式,一般分为以下几种情况:

  • 一个主题对应一个分区,只被一个消费者组的一个消费者消费,如下图(来源于网络)

在这里插入图片描述

在我们发送消息的时候,我们会给消息定义主题,对应的分区,同一个主题的消息可以发送到多个分区,在这里的主题概念如果很模糊的话,建议小伙伴们看一下发布订阅模式应该就会清晰一点。这里分区的概念,在我理解看来,主要也是和消费者组里面的消费者对应起来,一个消费者组中有多个消费者,不同的消费者消费不同的分区,这里要注意,一个消费者可以消费不同的分区,但是同一个分区是不能被多个消费者同时消费的,主要也是避免消息消费混乱的问题。还有一点,同一个主题可以被不同的消费者组的消费者进行消费,而且是互不干扰的

如上图,消费者中的消费者分别对应着自己的分区,这样每个消费这组维护者自己的offset,保证消费顺序是正常的。

  • 一个消费者开启对个线程消费消息,如下图(来源于网络)

Rhm8TP.png

其实原则上,是不建议一个消费者下开启多个线程来消费数据的,因为这种模式很大大增加编码的复杂度,多线程的开发增加了很大的维护成本,可能会产生一些很意外的生产环境问题,一般我们在设计消费模型时,建议是一个消费组的消费者数量尽量和主题的分区数量是一致的,就如第一种场景,消费者少于主题的分区数,可能会导致同一分区被多个消费者消费,消费者大于主题的分区数,会导致资源浪费,因为这个时候,多出来的消费者是空闲的,不会消费消息。

但是在一些极端情况下,我们可能避免不了在一个消费者中开启多个线程去消费数据,那么在这种情况下面,我们该怎么去保证消息的消费顺序呢?如下图(来源于网络)

在这里插入图片描述

我们这里可以在消息中添加一个字段,对于相同类型的数据其key是一样的,比如一个商品的订单,用户付款分别放入不同的队列,然后一个线程专门去消费一个指定的队列消息数据,这样不用的消息之间是独立的互补干扰,这样就保证了在多个线程下面消息消费的顺序问题,小伙伴们可以参考一下这个思路,当然欢迎提出更好的解决方案。

目前,在项目中,我是没有用到多个线程去同时消费数据的,一般用的第一种设计,通过指定主题的分区数和消费者组消费者的数量来保证数据消费顺序的问题,当然如果在消息量并不大的情况下,一个主题对应一个分区对应一个消费者组的一个消费者,这种模式肯定是最稳的哈哈哈,不过这也是根据实际的业务需求来判断的,好了,关于Kafka消息的顺序消费就说到这里了,下面一篇会和大家讲解一下Kafka的一下性能特点,为什么Kafka成为广泛受欢迎消息队列的原因。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值