导言

大家好,我是南橘,从接触java到现在也有差不多两年时间了,两年时间,从一名连java有几种数据结构都不懂超级小白,到现在懂了一点点的进阶小白,学到了不少的东西。知识越分享越值钱,我这段时间总结(包括从别的大佬那边学习,引用)了一些平常学习和面试中的重点(自我认为),希望给大家带来一些帮助


上一章,讲了分布式系统中的柔性事务解决方案,并且介绍了一下2PC、3PC、与TCC解决方案。这一次,给大家介绍一种可靠消息最终一致性解决方案,用来实现分布式事务。

  • 文章参考石杉的架构笔记

1、可靠消息最终一致性事务

可靠消息最终一致性方案是指当事务发起执行完全本地事务后并发出一条消息,事务参与方(消息消费者)一定能够接收消息并处理事务成功,此方案强调的是只要消息发给事务参与方最终事务要达到一致

2、实现可靠消息最终一致性方案

因为RocketMQ支持分布式消息,所以这个方案就用RocketMQ来实现。其实用什么消息中间件都只是业务上的选项,重要的是原理。

应某位同学的要求,我自己画了一张图。

  • 生产者生产消息
  • 消息确认服务器确认消息状态
  • RocketMQ传递消息
  • 消费者消费消息

流程:

  • 1、生产者发送消息给消息确认服务器,消息确认服务器存储消息,并且把消息状态改为待确认。
  • 2、生产者发送消息后执行本地数据库,执行成功则确认消息,失败则删除消息。
  • 3、此时如果是确认消息,那么消息确认服务器就把数据库里的消息状态更新为“已发送”,同时将消息发送给MQ。

如果数据库里更新消息的状态失败了,那么就抛异常退出了,就别投递到MQ。

如果投递MQ失败报错了,那么就要抛异常让本地数据库事务回滚。

这俩操作必须得一起成功,或者一起失败。

  • 4、消费者一直等着从MQ消费消息,如果消费到了消息,那么就操作自己本地数据库
  • 5、如果操作成功了,就反过来通知消息确认服务器,说自己处理成功了,然后消息确认服务器就会把消息的状态设置为“已完成”。

流程是不是很简单?但是要保证消息的最终一致性和可靠性,还是有不少的工作要做的。

3、如何保证生产者服务对消息的可靠投递

要保证生产者消息的可靠投递,生产者需要将消息存入自己的数据库中,根据据自己的执行结果,调用可靠消息服务的接口。

如果本地数据库操作执行成功了,那么就找可靠消息服务确认那条消息。如果本地数据库操作失败了,那么就找可靠消息服务删除那条消息。

同时,在消息确认服务器里开发一个后台定时运行的线程,不停的轮询检查各个消息的状态

如果上游服务操作完本地数据库之后,通知可靠消息服务确认消息或者删除消息的时候,出现了问题。这种情况,消息服务器中的消息一直是“待确认”状态,就认为这个消息出了点什么问题,可以回调生产者提供的一个接口,确认生产者数据库操作状态。

如果上游服务器执行成功了,那么可靠消息服务将消息状态修改为“已发送”,同时投递消息到MQ。

如果上游服务执行失败,那么可靠消息服务将数据库中的消息删除即可。

通过这套机制,就可以保证,可靠消息服务一定会尝试完成消息到MQ的投递。

4、如何保证消费者服务器对消息的可靠接收

要保消费者消息的可靠接受,也需要在消息确认服务器里开发一个后台定时运行的线程,通过这个线程,不停的轮询检查各个消息的状态

如果消息状态一直是“已发送”的状态,始终没有变成“已完成”,那么就说明消费者服务始终没有处理成功,这个时候消确认服务器就可以再次尝试重新投递消息到MQ,让消费者服务再次处理。

当然,为了保证数据的一致性,不至于出现重复消费的情况,幂等性的实现是必不可少的。

5、保证消息传递机制的高可用性

一、RabbitMQ的高可用

我们之前的文章讲过,RibbitMQ可以通过搭建集群来实现高可用,但是搭建不同的集群有不同的优劣,这里就不再重复水字数了。

【进阶之路】消息队列——RabbitMQ原理(二)

二、RocketMQ的高可用

RocketMQ是一款出生在高并发分布式时代的消息中间件,所以他本身就是支持高并发和事务的。同时,Name Server无状态,可线性扩展,天然支持高可用。

  • 1、多Master模式

多个Master节点组成的集群,即使有一个节点宕机,对于整个集群来说也没有什么影响。

缺点:单个Master节点宕机期间, 未被消费的消息在节点恢复之前不可用, 消息的实时性就收到影响。当然,使用同步技术可以让消息在各个节点之间同步,只是会导致效能和空间利用大幅下降,

  • 2、多Master多Slave异步复制模式

在多Master的基础上, 每个节点都有至少一个的Slave,Master节点可读可写,但是Slave节点只读不写, 这种情况似于MySQL的主备模式。

优点:单个Master节点宕机期间, Slave节点依旧可以读取消息。

缺点:异步复制的同步方式有可能导致消息丢失。

  • 3、多Master多Slave同步双写模式

与多Master多Slave异步复制模式类似, 区别在于Master和Slave之间的数据通过同步的方式传输。

优点: 数据与服务都无单点,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高。

缺点: 性能比异步复制模式稍低,大约低10%左右,发送单个消息的RT会稍高,目前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能。

三、Kafka 的高可用性

kafka本身是由多个broker组成,每个broker就是一个节点;创建一个topic,这个topic可以划分为多个partition,每个partition可以存在于不同的broker上,每个partition存放放一部分数据。

所以kafka就是一个分布式消息队列,一个topic的数据,是分散放在多个机器上的,每个机器就放一部分数据。

(找张图片来展示一下)


kafka 0.8以后,提供了HA机制,就是replica副本机制。kafka会均匀的将一个partition的所有replica分布在不同的机器上,提高容错性。若某个broker宕机了,刚好其上有某个partition的leader,那么此时kafka会自动重新选举出一个新leader,继续读写那个新leader即可。

写数据的时候:生产者就是leader,将数据落地写入本地磁盘,接着其他follower主动从leader来拉数据。一旦所有follower同步好数据,会发送ack给leader,leader收到所有follower的ack后,会返回写成功的消息给生产者。

消费的时候:只会从leader读,但是只有一个消息已经被所有follower都同步成功返回ack的时候,这个消息才会被读到,即leader和所有follower上都有了这个消息。

结语

这篇文章基本上就是对于分布式事务的一次总结了。我觉得如果大家想更加深入的了解,可以和我一样画画架构图,然后尝试着自己搭建一个简单的服务。这样效果真的不错,虽然在实际工作中大部分公司已经搭建了自己的框架,不过总是要不断更新的~总有一天我们也会独当一面不是?

同时需要思维导图的话,可以联系我,毕竟知识越分享越香!

消费消息删除_【进阶之路】可靠消息最终一致性解决方案相关推荐

  1. weblogic jms消息 删除_利用 Kafka 设置可靠的高性能分布式消息传递基础架构

    世界已经迈进"移动"时代,现在应用程序必须能够实时提供数据,这不仅包括数据库表中存储的重要最终结果,还包括用户使用应用程序时执行的所有操作.任何可用信息,例如,用户点击量.日志数据 ...

  2. weblogic jms消息 删除_消息队列与消息中间件概述:消息中间件核心概念与技术选型...

    什么是消息? "消息"是在两台计算机间传送的数据单位. 消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象. 什么是队列? 队列(Queue)队列是一种先进先出 ...

  3. active mq topic消费后删除_《我想进大厂》之MQ夺命连环11问

    继之前的mysql夺命连环之后,我发现我这个标题被好多套用的,什么夺命zookeeper,夺命多线程一大堆,这一次,开始面试题系列MQ专题,消息队列作为日常常见的使用中间件,面试也是必问的点之一,一起 ...

  4. 获取日志的等级_进阶之路:Java 日志框架全画传(中)

    导读:随着互联网和大数据的蓬勃发展,分布式日志系统以及日志分析系统得到了广泛地应用.目前,几乎在所有应用程序中,都会用到各种各样的日志框架来记录程序的运行信息.鉴于此,工程师十分有必要熟悉主流的日志记 ...

  5. 企业微信推送消息延迟_企业微信发送应用消息的实现

    企业号升级到企业微信后,发送应用消息的接口也变化了不少,除了原来的文本.图片.文件.语音.视频.图文消息等消息外,增加了文本卡片.markdown消息.小程序通知消息等内容,不过它们都可以共用一个接口 ...

  6. 工业级大数据接入MQ消息发送异常性及最终一致性解决方案-DW商业环境实战

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

  7. rocket mq 监听端口_MQ消息最终一致性解决方案

    随着分布式服务架构的流行与普及,原来在单体应用中执行的多个逻辑操作,现在被拆分成了多个服务之间的远程调用.虽然服务化为我们的系统带来了水平伸缩的能力,然而随之而来挑战就是分布式事务问题,多个服务之间使 ...

  8. 消息最终一致性解决方案之RabbitMQ实现

    RabbitMQ遵循了AMQP规范,用消息确认机制来保证:只要消息发送,就能确保被消费者消费来做到了消息最终一致性.而且开源,文档还异常丰富,貌似是实现分布式事务的良好载体 6.1 RabbitMQ消 ...

  9. 一致 先验分布 后验分布_「分布式技术」分布式事务最终一致性解决方案,下篇...

    各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题 上 ...

最新文章

  1. vue连线 插件_【Vue CLI】手把手教你撸插件
  2. MySQL数据库InnoDB存储引擎中的锁机制--转载
  3. mc网站服务器设置家怎么圈地,《我的世界》怎么圈地 设置方法教程
  4. 时钟周期及秒(s) 毫秒(ms) 微秒(μs) 纳秒(ns) 皮秒(ps)之间转换
  5. css黑色字白色描边,css怎么设置字体白色描边
  6. Dockerfile中CMD和ENTRYPOINT的区别
  7. java修饰方法_java接口中方法、属性修饰符详解
  8. 让UI设计显得魅力非凡,设计师少不了的渐变背景素材专辑,
  9. 提问的智慧 程序员成长之路
  10. Jetson nano : PWM风扇调速。
  11. JavaWeb项目上云教程(Java项目在腾讯云上部署操作教程)
  12. 02-linux-arm板上opencv移植--终极解决方案之buildroot基础配置(原创)
  13. AppLocker 简要实验笔记
  14. matlab小船渡河物理模型,【物理】小船渡河模型及关联速度问题
  15. 收藏本站——添加到浏览器收藏夹
  16. 项目笔记(一):实验——用神经网络实现midi音乐旋律音轨的确定
  17. MACD策略引入backtrader出错
  18. Linux 如何支持远程图形
  19. 用C#制作有提示窗体的日程管理器
  20. 思维导图ubuntu_Ubuntu系统---安装思维导图XMind

热门文章

  1. 从一张表里选择一列加入到另一张表_【附中奖名单】| Excel妙招,数据透视表也能轻松做好排序!...
  2. python数据分析知识点_Python基础知识点总结:数据
  3. 创建虚机时间_云原生虚机应用托管设计篇
  4. 首批唯一!阿里云视频直播服务获信通院首批唯一认证
  5. SAE帮助「海底小纵队学英语」全面拥抱Serverless
  6. Android Native crash 处理案例分享
  7. 同学,你有一份来自支付宝AI学姐的面试锦囊待查收
  8. 游戏开发者需要注意的4个内存使用问题
  9. ORACLE--PMON SMON MMNL MMAN MMON
  10. 创建Goldengate例外句丙记录跟踪Oracle错误