第十四节 RabbitMQ-顺序消费,消息堆积的处理

亮子 2024-03-05 01:50:30 19239 0 0 0

第07单元-RabbitMQ-05-顺序消费,消息堆积的处理

项目需求:

系统平台会在情人节、圣诞节、七夕节、光棍节等节日免费送鲜花和礼物。

需求描述:

为了增加平台用户的活跃度和忠诚度,在情人节、圣诞节、七夕节、光棍节等节日的时间节点,平台会采取一些促活活动,比如赠送鲜花,限时领取,先到先得。这就要求领取的用户有先后顺序,先到先得。由于举行活动的原因,用户量会短时间内发送大量申请,因此也要解决消息堆积的问题。


顺序消费消息通常在以下业务场景中会被使用:

  1. 订单处理:在电子商务系统中,订单的创建、支付、发货等操作可能需要按照顺序进行处理,以避免订单状态混乱或出现不一致情况。

  2. 金融交易:金融系统中的交易流程通常需要按照特定的顺序进行处理,以确保交易的一致性和准确性。

  3. 任务调度:某些任务可能需要按照特定的顺序依次执行,以确保任务之间的依赖关系得到满足。

  4. 流程审批:在企业内部的审批流程中,如请假申请、报销审批等,有些环节可能需要按照顺序进行处理,以确保流程的合规性和完整性。

在以上业务场景中,消息的顺序消费非常重要,因为消息的处理顺序直接影响业务流程的正确性和完整性。因此,在设计消息系统时,需要考虑如何确保消息的顺序消费,通常可以通过合理的消息队列设计和消费者处理逻辑来实现。

1、顺序消费

1)、顺序消费

消息在投入到queue的时候是有顺序,如果只是单个消费者来处理对应的单个queue,是不会出现消息错乱的问题。但是在消费的时候有可能多个消费者消费同一个queue,由于各个消费者处理消息的时间不同,导致消息未能按照预期的顺序处理。其实根本的问题就是如何保证消息按照预期的顺序处理完成。

出现消费顺序错乱的情况:

1、为了提高处理效率,一个queue存在多个consumer
2、一个queue只存在一个consumer,但是为了提高处理效率,consumer中使用了多线程进行处理

2)、保证消息顺序性的方法

将原来的一个queue拆分成多个queue,每个queue都有一个自己的consumer。该种方案的核心是生产者在投递消息的时候根据业务数据关键值(例如订单ID哈希值对订单队列数取模)来将需要保证先后顺序的同一类数据(同一个订单的数据) 发送到同一个queue当中。

一个queue就一个consumer,在consumer中维护多个内存队列,根据业务数据关键值(例如订单ID哈希值对内存队列数取模)将消息加入到不同的内存队列中,然后多个真正负责处理消息的线程去各自对应的内存队列当中获取消息进行消费。

3)、RabbitMQ保证消息顺序性总结:

核心思路就是根据业务数据关键值划分成多个消息集合,而且每个消息集合中的消息数据都是有序的,每个消息集合有自己独立的一个consumer。多个消息集合的存在保证了消息消费的效率,每个有序的消息集合对应单个的consumer也保证了消息消费时的有序性。

2、消息堆积

1)、消息堆积的原因

RabbitMQ消息堆积可能由多种原因导致,以下是一些常见的原因:

  1. 消费者处理能力不足:如果消费者处理消息的速度跟不上消息的产生速度,就会导致消息在队列中积压。

  2. 网络或硬件故障:网络故障、RabbitMQ节点故障或者硬件故障等问题可能导致消息不能正常传输或处理,从而导致消息堆积。

  3. 消息体积过大:如果消息体积过大,可能会导致队列中的消息数量增加,从而造成消息堆积。

  4. 消息消费失败:如果消息的消费者处理失败,但又没有设置合适的重试机制或者死信队列,那么这些失败的消息可能会一直积压在队列中。

  5. 队列设置不当:队列的参数设置不当,如未设置合理的最大长度、超时时间或者未设置合适的优先级等,都可能导致消息堆积。

  6. 突发流量:某些特殊情况下,如系统故障恢复、大量消息同时到达等情况可能会导致突发流量,从而引发消息堆积。

综上所述,消息堆积可能由消费者处理能力、系统故障、消息体积、消费失败、队列设置和突发流量等多种原因导致。因此,在处理消息堆积问题时,需要全面分析可能的原因,并采取相应的措施来解决问题。

2)、消息堆积的处理方法

处理RabbitMQ消息堆积的方法通常包括以下几个方面:

  1. 监控和预警:通过监控RabbitMQ的队列深度和消息积压情况,设置合理的阈值,并在达到预警条件时及时发出警报,以便及时发现消息堆积的情况。

  2. 扩容和优化:对于消息堆积严重的队列,可以考虑对RabbitMQ进行扩容,增加节点或者优化硬件配置,以提高系统的吞吐能力和处理能力。

  3. 消费者处理:检查消费者的消费能力,如果消费者处理能力不足导致消息堆积,可以考虑增加消费者实例或者优化消费者的处理逻辑,提高消费速度。

  4. 重试和死信队列:对于处理失败的消息,可以设置重试机制,一定次数内尝试重新消费,如果依然失败则将消息发送到死信队列,以便后续处理。

  5. 手动干预:在极端情况下,可以考虑手动干预,例如清空队列、重新发布消息等方式来处理消息堆积问题,但需要谨慎操作,避免数据丢失或者重复消费。

总的来说,处理RabbitMQ消息堆积需要综合考虑监控预警、系统扩容、消费者处理、重试机制和手动干预等多个方面,根据具体情况采取相应的措施来解决问题。