写点什么

对线面试官 - MQ 之如何保证消息的顺序性及消息积压问题

作者:派大星
  • 2023-08-29
    辽宁
  • 本文字数:1165 字

    阅读完需:约 4 分钟

书接上文。这次继续聊一聊 MQ


面试官:如何保证消息的顺序性,可以简单聊聊什么场景需要避免这种问题的发生以及如何解决吗?


派大星:当然可以。其实就 MySQL 而言来说,比如需要依赖 MySQL 的 binlog 做一个同步系统。用户在 MySQL 中增删改一条数据,对应出来增删改 3 条 binlog,接着将这 3 条 binlog 同步到 MQ 里面。然后到消费出来一次执行,此时就需要保证消息的顺序性,不然就会出现问题。


面试官:嗯,不错那你简单说说不同 MQ 消息错乱的一个场景吗?


派大星:可以的。


  • 首先来说 RabbitMQ:一个 queue,多个 consumer,这就会出现问题;因为多个消费者是同步一起执行的,无法保证顺序性,并且也无法保证消费者消费到了哪条数据。简单如图所示:



**解决方案:**每个消费者建立对应的 queue,并且让保持顺序的消息只发送到一个 queue 上,这样消费者消费数据处理的时候就不会出现顺序错乱。


  • 其次说一下 Kafka:


首先来说 Kafka 是可以保证生产者写入一个 partition 的数据一定是有顺序的。


在 Kafka 使用中,只要 Kafka 内部不涉及多个线程并发处理的情况下,其实我们只需要在生产者写入数据的时候可以指定一个 key,比如指定某个订单 id 作为 key,这个订单相关的数据就会被分发到一个 partition。这里我们要知道一个原则是Kafka一个partition只能被一个消费者消费,这样消费者从 partition 中取出来的数据一定是有顺序的。


面试官:什么情况下 Kafka 会出现消息顺序不一致的情况呢?


派大星:当消费者内部搞多个线程并发处理的时候,则可能会出现顺序不一致的问题。如图所示:



面试官:那如何解决 Kafka 多线程处理导致的消息错乱问题呢?


派大星:其解决方案可以是采用hash算法进行 hash 分发。相同的订单 key 的数据分发到同一个内存queue里面去。如图所示:



面试官:嗯,不错。那你在实际使用过程中有遇到过消息积压的问题吗?能说说遇到这种问题的时候你的解决思路是什么样的?


派大星:好的。其实在面对消息有积压的情况。多数都是消费者故障导致的。简单的解决思路如下:可以当做是一个临时紧急扩容的一个方案:


  1. 如果 consumer 有问题,先修复 consumer 的问题,确保其恢复消费速度。然后将现有的 consumer 都停掉。

  2. 临时建立好原先 10 倍或 20 倍的 queue 的数量。(Kafka-新建一个 topic,partition 是原来的十倍)

  3. 写一个临时分发数据的 consumer 程序,这个程序部署上去消费积压的数据,消费之后不做耗时处理,直接均匀轮询写入已经建立好 10/20 倍数量的 queue 中。

  4. 接着临时征用 10 倍的机器来部署 consumer,每一批 consumer 来消费一个临时 queue 的数据。

  5. 最后等快速消费完积压的数据之后,得恢复原来部署架构,重新使用原来的 consumer 机器来消费。


面试官:不错。思路不错。突然有个问题,如何解决 RabbitMQ 中消息延时过期失效的问题?


派大星:RabbitMQ 有一个 TTL 过期时间,关掉不要开启 TTL。


如有问题,欢迎加微信交流:w714771310,备注- 技术交流 。或关注微信公众号【码上遇见你】。




发布于: 刚刚阅读数: 6
用户头像

派大星

关注

微信搜索【码上遇见你】,获取更多精彩内容 2021-12-13 加入

微信搜索【码上遇见你】,获取更多精彩内容

评论

发布
暂无评论
对线面试官 - MQ之如何保证消息的顺序性及消息积压问题_MQ_派大星_InfoQ写作社区