• 消息队列核心-如何保证消息不丢失


    使用消息队列,绕不开的一个问题就是如何保证消息不丢失,现在主流的消息中间件都提供了完整的消息可靠性保证机制,可以确保消息的可靠传递,本文以rocketMq为例介绍如何保证消息不丢失,其他消息队列类似。原文地址

    消息传递过程

    基本上所有的消息都划分为三个阶段生产、存储、消费,如下图

    • 生产阶段: 在这个阶段,从消息在 Producer 创建出来,经过网络传输发送到 Broker 端。
    • 存储阶段: 在这个阶段,消息在 Broker 端存储,如果是集群,消息会在这个阶段被复制到其他的副本上。
    • 消费阶段: 在这个阶段,Consumer 从 Broker 上拉取消息,经过网络传输发送到 Consumer 上。

    生产阶段

    生产阶段一般是通过confirm机制,producer把消息发送给broker,broker收到消息后会给客户端响应回执,producer收到回执则完成一次完整的消息发送。producer如果没有收到响应回执则会重发。

    存储阶段

    如果Broker是单点的,可以通过参数设置,当消息持久化后再给响应回执,如果是 Broker 是由多个节点组成的集群,需要将 Broker 集群配置成:至少将消息发送到 2 个以上的节点,再给客户端回复发送确认响应。这样当某个 Broker 宕机时,其他的 Broker 可以替代宕机的 Broker,也不会发生消息丢失

    消费阶段

    消费阶段和生产阶段类似,都是通过confirm机制保障消息不丢失的,客户端从 Broker 拉取消息后,执行用户的消费业务逻辑,成功后,才会给 Broker 发送消费确认响应。如果 Broker 没有收到消费确认响应,下次拉消息的时候还会返回同一条消息,确保消息不会在网络传输过程中丢失,也不会因为客户端在执行消费逻辑中出错导致丢失。

    reference

    《消息队列高手》

  • 相关阅读:
    android 工具类 DateUtil
    POJ1580 水题,积累!
    POJ1159,Palindrome
    iOS开发UI篇章 15-项目中的常见文件
    MongoDB:Map-Reduce
    三层架构下实现用户登陆C#
    Inno Setup 安装inf文件的一个例子
    delphi 主线程向子线程发送消息
    PeekMessage和GetMessage函数的主要区别
    delphi SPCOMM的一些用法注意
  • 原文地址:https://www.cnblogs.com/bangaj/p/13604857.html
Copyright © 2020-2023  润新知