消息中间件的背景介绍
消息中间件能够解决的问题
异步
很多业务场景我们需要把同步的任务变成异步的任务。
拿一个电商平台的注册功能来简单分析下,用 户注册这一个服务,不单单只是insert一条数据到数据库里面就完事了,还需要发送激活邮件、发送新人红包或者积分、发送营销短信等一系列操作。假如说这里面的每一个操作,都需要消耗1s,那么整个注册过程就需要耗时4s才能响应给用户。
那么我们需要把这些操作拆出来,优化变成异步处理的逻辑。
- 我们可以使用阻塞队列+线程池来实现生产者消费者模式。
- 但是这种方式只适用于单机,一旦机器宕机,那么原来在阻塞队列中存储的数据内容就丢失了。
- 使用消息中间件来处理
削峰
用户提交过来的请求,先写入到消息队列。消息队列是有长度的,如果消息队列长度超过指定长度, 直接抛弃。这样就把流量的峰值削掉了。
限流
秒杀的具体核心处理业务,接收消息队列中消息进行处理,这里的消息处理能力取决于消费端本身的 吞吐量
解耦
不同程序语言之间可以通过消息队列来达到通信。
消息持久化
能够不用担心应用程序挂了而无法消费消息
当然,消息中间件还有更多应用场景,比如在弱一致性事务模型中,可以采用分布式消息队列的实现最 大能力通知方式来实现数据的最终一致性等等
思考消息中间件的设计
可以先从基本的需求开始思考
- 最基本支持消息的收发
- 网络通信就会考虑NIO
- 消息的存储
- 持久化,非持久化
- 消息的序列化,反序列化
- 是否跨语言
- 消息的确认机制
- 如何避免消息的重发
高级功能
- 消息的有序性
- 是否支持事物消息
- 消息收发的性能,对高并发大数据的支持
- 是否支持集群
- 消息的可靠性传输
- 是否支持多协议
消息中间件的发展过程
实际上消息中间件的发展也是挺有意思的,我们知道任何一个技术的出现都是为了解决实际问题,这个 问题是 通过一种通用的软件总线
也就是一种通信系统,解决应用程序之间繁重的信息通信
工作。
最早的小白鼠就是金融交易领域,因为在当时这个领域中,交易员需要通过不同的终端完成交易,每台终端显示不同的信息。
如果接入消息总线,那么交易员只需要在一台终端上操作,然后订阅其他终端感兴趣 的消息。于是就诞生了发布订阅模型(pubsub),同时诞生了世界上第一个现代消息队列软件(TIB) The information Bus, TIB允许开发者建立一系列规则去描述消息内容,只要消息按照这些规则发布出 去,任何消费者应用都能订阅感兴趣的消息。
随着TIB带来的甜头被广泛应用在各大领域,IBM也开始研 究开发自己的消息中间件,3年后IBM的消息队列IBM MQ产