版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。QQ 邮箱地址:1120746959@qq.com,如有任何技术交流,可随时联系。

1 工业级高并发数据接入消息一致性保障

  • 消息中间件在高并发数据接入大数据平台时的的主要作用: 异步通讯、解耦、并发缓冲
  • 消息发送一致性:是指产生消息的业务动作与消息发送的一致。 (也就是说,如果业务操作成功,那么由这个业务操作所产生的消息一定要成功投递出去,否则就丢消息)

2 工业级 MQ 数据接入消息一致性理论模型

2.1 从主动方业务来分析

  • 预发送消息失败,消息未进存储,业务操作未执行(可能的原因:主动方应用、网络、消息中间件、消息存储),数据此时保持一致。

  • 预发送消息后,主动方业务没有收到返回消息存储结果,分为两种可能

          (1)消息未进存储,业务操作未执行             数据此时保持一致。
          (2)消息已进存储(待确认),业务操作未执行    数据此时保持不一致。
    复制代码
  • 收到消息存储成功的返回结果,但未执行业务操作就失败

      消息已进存储(待确认),业务操作未执行         数据此时保持不一致。
    复制代码

2.2 从消息中间件的角度来分析:

  • 消息中间件没有收到主动方应用的业务操作处理结果

      (1)消息已进存储(待确认),业务操作未执行(或 业务操作出错回滚了)         数据此时保持不一致
      (2)消息已进存储(待确认),业务操作成功                                  数据此时保持不一致
    复制代码
  • 消息中间件收到业务操作结果(成功 / 失败),但处理消息存储中的消息状态失败

    (1)消息已进存储(待确认),业务操作未执行(或业务操作出错回滚了)            数据此时保持不一致
    (2)消息已进存储(待确认),业务操作成功                                    数据此时保持不一致
    复制代码

2.3 可靠消息的整体流程

    1. 主动方应用先把消息发给消息中间件,消息状态标记为“待确认”;
    1. 消息中间件收到消息后,把消息持久化到消息存储中,但并不向被动 方应用投递消息;
    1. 消息中间件返回消息持久化结果(成功 / 失败),主动方应用根据返 回结果进行判断如何进行业务操作处理:

         a) 失败:放弃业务操作处理,结束(必要时向上层返回失败结果);
         b) 成功:执行业务操作处理;
      复制代码
    1. 业务操作完成后,把业务操作结果(成功 / 失败)发送给消息中间件;
    1. 消息中间件收到业务操作结果后,根据业务结果进行处理;

      a)失败:删除消息存储中的消息,结束; b) 成功:更新消息存储中的消息状态为“待发送(可发送)”;

    1. 被动方应用监听并接收“待发送”状态的消息,执行业务处理;
    1. 业务处理完成后,向消息中间件发送 ACK,确认消息已经收到(消息 主动方应用主机 / 主机集群 消息中间件主机 / 主机集群 被动方应用主机 / 主机集群 中间件将从队列中删除该消息)。

2.4 消息重复发送异常分析

  • 1 被动方应用接收到消息,业务处理完成后应用出问题,消息中间件不知道消息处理结果,会重新投递消息。
  • 2 被动方应用接收到消息,业务处理完成后网络出问题,消息中间件收不到消息处理结果,会重新投递消息。
  • 3 被动方应用接收到消息,业务处理时间过长,消息中间件因消息超时未确认,会再次投递消息。
  • 4 被动方应用接收到消息,业务处理完成,消息中间件问题导致收不到消息处理结果,消息会重新投递。
  • 5 被动方应用接收到消息,业务处理完成,消息中间件收到了消息处理结果,但由于消息存储故障导致消息没能成功确认, 消息会再次投递。

3 工业级 MQ 数据接入消息一致性实际处理方案

感谢    赞同    分享    收藏    关注    反对    举报    ...