分布式事务八_可靠消息最终一致性方案-copy

摘要:
从上一篇文章的分析可以得出我们面临的问题,即现有的MQ中间件产品不支持消息发送一致性过程的直接转换,或者开发MQ中间件的难度很大。基于本地消息服务的设计和实现思想,主动应用系统加入了消息存储模块。也就是说,业务操作和消息在同一本地事务中存储和发送。如果主动发送操作失败,请删除消息。

面临的问题
通过前面文章的分析可以得到一下结论

现成的MQ中间件产品不支持消息发送一致性流程(先进存储,在被确认后才能发送的2步流程)
直接改造或者开发MQ中间件的难度大
基于本地消息服务的设计


实现思路
主动方应用系统加入消息存储模块。即业务操作和消息存储与发送在同一个本地事务中。先将需要发送的消息存储在本地数据库,设置其状态为代发送
将消息数据中为待发送的消息发送到MQ,MQ 推送到其他应用系统处理
其他应用系统处理结束后回调主动发系统并修改消息的状态或者删除消息
消息恢复系统:用来查询那些超时未处理状态的消息并设置延时发送
优点
1.消息时效性比较高 2.从应用设计开发的角度实现了消息数据的可靠性,消息数据的可靠性不依赖于MQ中间件,弱化了对MQ中间件特性的依赖 3.方案轻量,容易实现

独立消息服务的设计


实现思路
与上面的方案相比独立实现了消息服务子系统

主动发应用发送预发送消息,消息服务子系统 存储预发送消息状态未预发送,并返回操作结果

主动发应用在预发送消息成功的前提下开始进行业务操作

主动发应用发送业务操作结果给消息系统

消息系统确认并发送消息,并设置消息状态为发送中

MQ将消息转发到其他业务系统

消息状态确认子系统 查询消息服务子系统中状态还是预发送的超时消息,并查询此消息在主动方应用系统的处理情况。如果主动发业务操作失败则删除该消息。如果主动方业务操作成功则修改状态为待发送,且将信息发送到MQ

消息恢复系统:用来查询那些超时未处理状态的消息并设置延时发送

优点:
消息服务独立部署、独立维护、独立伸缩
消息存储可以按需选择不同的数据库来集成实现
消息服务可以被相同的使用场景公用,降低重复建设消息服务的成本
从应用(分布式服务)设计开发的角度实现了消息数据的可靠性,消息数据的可靠性不依赖与MQ中间件,弱化了对MQ中间件特性的依赖
降低了业务系统与消息系统间的耦合,有利于系统的扩展维护
可靠消息最终一致性方案的优化
数据库: Redis(可靠性、可用性、性能)
特别注意持久化的配置 appendfsynnc always 只要有新添加的数据就将数据缓存同步到磁盘
消息日志表:适用于被动方应用业务的幂等性判断比较麻烦或比较消耗性能的情况,但会增加一定的开发工作量等
分布式调度
独立业务使用独立消息服务(提高性能、隔离解耦、但增加维护成本和工作量)
弊端/局限
一次消息发送需要两次请求
主动发应用系统需要实现业务操作状态校验接口
————————————————
版权声明:本文为CSDN博主「chenshiying007」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_27384769/article/details/79308210

免责声明:文章转载自《分布式事务八_可靠消息最终一致性方案-copy》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇分布式事务11_TCC 两阶段型、补偿型-copy分布式事务10_最大努力通知形-copy下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

大型网站的架构

任何一个大型网站都是经历用户积累然后成长,从一台服务器到多台服务器才能构架支撑网站现有数据、用户、页面请求等。大型网站(如淘宝、京东等)的系统架构并不是开始设计就具备完整的高性能、高可用、安全等特性,它总是随着用户量的增加,业务功能的扩展逐渐演变完善的,在这个过程中,开发模式、技术架构、设计思想也发生了很大的变化,就连技术人员也从几个人发展到一个...

ubuntu下DNS原理及相关设置

1.DNS原理分析如下: 当 DNS 客户机需要查询程序中使用的名称时,它会查询本地DNS 服务器来解析该名称。客户机发送的每条查询消息都包括3条信息,以指定服务器应回答的问题。● 指定的 DNS 域名,表示为完全合格的域名 (FQDN) 。● 指定的查询类型,它可根据类型指定资源记录,或作为查询操作的专门类型。● DNS域名的指定类别。对于DNS 服务器,...

IIS发布网站遇到 编译器错误消息: CS0016: 未能写入输出文件“c:WindowsMicrosoft.NETFramework64v4.0.30319Temporary 编

编译错误:说明:在编译向该请求提供服务所需资源的过程中出现错误。请检查下列特定错误详细信息并适当地修改源代码。编译器错误消息:CS0016: 未能写入输出文件“c:WindowsMicrosoft.NETFramework64v4.0.30319Temporary .................................拒绝访问。网上搜索了一下解决...

一个Boss直聘机器人, 自动回复发简历

goBoss 基佬github地址 这是基于go语言编写的一款boss直聘机器人软件(牛人版)。附上Python版本,无需配置Go环境, 我会提供windows和macos的可执行程序。不喜勿喷O(∩_∩)O~ 闪光点 自动回复boss消息 回复消息有3种类型。可自行修改, 传入关键字即可(忽略大小写如b站)。消息同一个人只会回复一次。 大厂 普...

RabbitMQ提升消息可靠性的方法

mandatory参数 当mandatory参数设置为true的时候,交换器无法根据自身的类型和路由键找到一个符合条件的队列,那么RabbitMQ会调用Basic.Return命令将消息返回给生产者。当mandatory参数设置为false时,出现上述情形,则消息直接被丢弃。 生产者是如何获取到没有被正确路由到合适的队列的消息呢?可以通过调用channel....

C# 4.0新特性dynamic作用浅析

51CTO.com曾经报道过讲解C# 4.0中的动态类型和动态编程的文章,也曾对C# 4.0动态编程技巧做过一些演示。但依然有读者不太了解dynamic到底有那些作用。本文摘选博主“胡里胡涂”的一篇文章,针对作者提出的两个问题对dynamic进行理解。 ◆写程序时少了智能感知 ◆运行程序时速度变慢(反射) 看完New features in CSharp...