概述
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于 数据通信 来进行 分布式系统 的集成。通过提供消息传递和消息排队模型,它可以在 分布式 环境下扩展进程间的通信。可与OA、ERP集成的免费消息中间件Active Messenger(简称AM)是一款非常实用的企业即时通讯软件。系统提供免费的消息中间件(以com组件的方式提供),开放给第三方程序使用。
1. 消息系统的价值
1.1没有消息系统的时候
假设你负责系统的用户注册模块开发,突然有一天接到产品的要求让你增加注册成功之后发短信任务,此时你屁颠屁颠的找到用户注册部分的代码,然后你快速的在代码后面加上调用短信服务的代码,心满意足的提交了。又过了几天,心得需求是增加注册送积分活动。
1.2引入消息系统
用户注册成功时,发送消息给消息中间件,其他系统向消息中间件订阅这个消息,完成相应工作。通过消息中间件的 解耦 ,注册系统不关心有多少系统需要知道注册成功这件事,也不用关心如何通知它们,只需要把登录成功这件事转化为一个消息发送到消息中间件。这样,需要了解登录成功这件事的系统自己去消息中间件订阅就行。
2. 互联网时代的消息中间件
消息中间件的两个重要特点解耦和异步。需要思考的问题:消息的顺序保证、扩展性、可靠性、业务操作与消息发送的一致性,以及多集群订阅者问题。
2.1消息发送的一致性
异常分析:
业务应用发送消息给消息中间件。如果失败,业务操作没有做,消息也没有存储在消息中间件,业务操作和消息的状态是一致的,没有问题。
消息中间件把消息入库。如果失败,可能情况:消息中间件失效,应用收不到返回结果;插入消息失败,收到返回失败结果给应用。
业务应用收到消息中间件结果异常。如果有业务应用正常,业务应用不知道在消息中间件的处理结果,按照失败来处理,如果入库成功,就会造成不一致;
如果业务应用自身有问题,消息入库成功,也会造成不一致;如果入库失败,则还是一致的。
业务应用进行业务操作。
业务应用发送业务操作结果给消息中间件。如果出现问题,消息中间件不知道如何操作存储的消息,可能会造成不一致。
消息中间件更新消息状态。出现问题同上。
从业务应用的视角分析异常情况:
异常情况可能的状态
发送消息给消息中间件失败业务操作未进行,消息未存储
消息发出后没有收到消息中间件响应业务操作未进行,消息存储,待处理
业务操作未进行,消息未存储
收到消息中间件返回成功,业务操作失败业务操作未进行,消息存储,待处理
从消息中间件的视角分析异常情况:
异常情况可能的状态
没有收到业务应用的业务操作结果业务操作未进行,消息存储,待处理
业务操作未进行(操作完又回滚),消息存储,待处理
业务操作成功,消息存储,待处理
收到业务应用的业务处理结果,更新消息状态失败业务操作未进行,消息存储,待处理
业务操作未进行(操作完又回滚),消息存储,待处理
业务操作成功,消息存储,待处理
各种异常情况状态:
业务操作未进行,消息未存储
业务操作未进行,消息存储,状态待处理
业务操作成功,消息存储,状态待处理
情况1,无需处理,因为本身一致;情况2和情况3需要进行补偿。
最终一致性接口封装 伪代码 :
发送消息给消息中间件
获取返回结果
如果失败,返回失败
进行业务操作
获取业务操作结果
发送业务操作结果给消息中间件
返回处理结果
可以把实现逻辑封装在一个调用中,然后把业务操作包装成一个对象传进来,然后整个流程就可以控制在这个方法中。
2.2消息中间件与使用者的强依赖问题
如果消息中间件系统出现问题,就会导致业务操作无法继续执行。
2.3消息重复投递
分布式事务 :实现复杂
接收者消息处理幂等性:降低消息中间件复杂,增加接受者门槛
2.4消息优先级
局部顺序:和某件事相关的多条消息之间有顺序,创建->付款->发货->确认。
总结
到这里,战无不胜企业级高并发消息 中间件技术 解决方案就结束了,,不足之处还望大家多多包涵!!觉得收获的话可以点个关注收藏转发一波喔,谢谢大佬们支持。(吹一波,233~~)
下面和大家交流几点编程的经验:
1、多写多敲代码,好的代码与扎实的基础知识一定是实践出来的
2丶 测试、测试再测试,如果你不彻底测试自己的代码,那恐怕你开发的就不只是代码,可能还会声名狼藉。
3丶 简化编程,加快速度,代码风骚,在你完成编码后,应回头并且优化它。从长远来看,这里或那里一些的改进,会让后来的支持人员更加轻松。
最后,每一位读到这里的网友,感谢你们能耐心地看完。希望在成为一名更优秀的 Java 程序员的道路上,我们可以一起学习、一起进步。
内部交流群569068099 欢迎各位前来交流和分享, 验证:(007)
Java小毛驴,头条出品,每天一篇干货,喜欢就收藏+关注