当前位置: 首页 > article >正文

MQ的可靠消息投递机制

  • 确保消息在发送、传递和消费过程中不会丢失、重复消费或错乱。

1. 消息的可靠投递

  • 消息持久化

    • 消息被发送到队列后会存储在磁盘上,即使消息队列崩溃,消息也不会丢失。
    • 例如:Kafka、RabbitMQ等都支持持久化消息。Kafka通过将消息存储在日志文件中,而RabbitMQ通过磁盘队列持久化消息。
  • 消息确认机制(ACK)

    • 消息生产者发送消息后,消费者需要返回确认(ACK)表示已成功处理,若在超时时间内未确认,则消息会被重新投递。
    • 例如:RabbitMQ和Kafka都有确认机制,RabbitMQ支持消息的“消息确认”和“消费者确认”,Kafka支持消费者的“提交偏移量”来确认消息消费。

2. 消息的幂等性

  • 确保消息只被处理一次

    • 消息消费者处理消息时需要设计幂等性,即即使消息被重复消费,也不会对系统产生副作用。实现方式有:
      • 通过唯一的消息ID(如UUID)来标记每个消息,消费者可以根据消息ID判断该消息是否已处理。
      • 设计冪等的消费逻辑,例如通过数据库的唯一约束来避免重复插入。
  • 防止重复消费

    • 消费端去重:设计消费者使用唯一标识符(如UUID)存储已处理的消息。
    • 事务机制:结合数据库的事务,保证消息的处理与数据库操作一致性。

3. 消息重试与死信队列(DLQ)

  • 消息重试

    • 当消息处理失败时,可以设置消息重试机制。例如:RabbitMQ的“重新入队”策略和Kafka的重试机制。重试次数和时间间隔可以配置,避免无休止的重试。
    • 一般会增加退避时间(Backoff),例如指数退避算法,防止系统过载。
  • 死信队列(DLQ)

    • 消息在经过多次重试仍然无法处理时,会被送到死信队列(Dead Letter Queue)。该队列用于存储无法消费的消息,可以进行人工干预或进一步的分析。

4. 消息顺序性

  • 消息顺序问题
    • 分布式系统中,消息可能会在不同的节点上处理,因此保证消息的顺序性是一项挑战。
    • 分区策略:使用分区(Partition)来确保特定类别的消息始终由同一消费者处理,Kafka通过消息的键来确定消息的分区,从而确保消息顺序。
    • 队列顺序:RabbitMQ中可以使用单个队列保证消息顺序,但这会限制并发度。

5. 消息的幂等性和事务性

  • 事务消息

    • 例如,RocketMQ 支持事务消息,允许生产者先发送消息,然后执行业务操作,最后提交事务。可以确保消息与业务操作的一致性。
  • 分布式事务

    • 在跨服务的场景下,可以使用分布式事务(如 TCC 或 Saga)来保证消息投递与后端操作的一致性。

6. 消息积压与消费能力

  • 积压处理
    • 当消费者处理速度不及时,可能会出现消息积压。解决方法包括:
      • 消费者扩展:增加消费者实例,提升消费能力。
      • 限流:对于生产者,控制消息的生产速度;对于消费者,控制消费的速率,避免系统过载。
      • 动态负载均衡:自动调整消费者的数量和负载,保障消息的及时消费。

7. MQ的监控和报警机制

  • 监控

    • 对MQ系统的监控非常重要,包括监控消息投递的成功率、延迟、积压等。
    • Kafka:提供监控接口,可以查看消息消费的延迟、主题的积压等。
    • RabbitMQ:可以通过管理插件监控消息的队列长度、消费者连接状态等。
  • 报警机制

    • 对于消息的积压、消费失败、队列长度异常等情况,可以设置报警机制,快速响应系统异常。

总结

  • 确保消息可靠投递:消息持久化、确认机制、幂等性设计。
  • 防止消息丢失与重复消费:重试机制、死信队列、幂等性设计。
  • 保证消息顺序性:分区机制、队列顺序。
  • 扩展能力:消费者扩展、积压管理、限流。
  • 监控与报警:消息延迟、积压、消费速率等指标的监控。

http://www.kler.cn/a/518713.html

相关文章:

  • 【机器学习】深入探索SVM:支持向量机的原理与应用
  • C++异常处理
  • 【2025年数学建模美赛F题】(顶刊论文绘图)模型代码+论文
  • const的用法
  • Python “字典” 实战案例:5个项目开发实例
  • electron打包客户端在rk3588上支持h265硬解
  • 【Uniapp-Vue3】previewImage图片预览
  • 编译原理之基于自动机的词法分析器的设计与实现
  • 省市区三级联动
  • centos操作系统上以service形式运行blackbox_exporter监控网页端口
  • 【JAVA 基础 第(20)课】JDBC JAVA 连接 MySql 数据库
  • [C++技能提升]类型归一
  • 定位的主要知识
  • OpenCV:图像处理中的低通滤波
  • 小哆啦解题记:寻找最后一个单词的“长度”
  • 数据结构与算法分析:专题内容——人工智能中的寻路6之NegMax(代码详解)
  • 链式存储结构
  • 详解生成对抗网络(GAN)模型
  • Oracle迁移DM数据库
  • Facebook 元宇宙与全球文化交流的新趋势
  • 1.CSS的三大特性
  • 【Address Overfitting】解决过拟合的三种方法
  • 刷题总结 回溯算法
  • python3+TensorFlow 2.x(二) 回归模型
  • 理解神经网络:Brain.js 背后的核心思想
  • TMC2224替换DRV8824