文章目录
- 前言
- 一、什么是消息中间件?
- 二、为什么使用?
- 二、使用消息中间件前后对比
- 三、当前几种中间件:
- 四、使用消息中间件场景:
前言
一般认为,采用消息传送机制/消息队列 的中间件技术,进行数据交流,用在分布式系统的集成。
一、什么是消息中间件?
中间件被描述为为应用程序提供操作系统所提供的服务之外的服务,简化应用程序的通信、输入输出的开发,使他们专注于自己的业务逻辑。
消息中间件适用于需要可靠的数据传送的分布式环境。采用消息中间件机制的系统中,不同的对象之间通过传递消息来激活对方的事件,完成相应的操作。发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。消息中间件能在不同平台之间通信,它常被用来屏蔽掉各种平台及协议之间的特性,实现应用程序之间的协同,其优点在于能够在客户和服务器之间提供同步和异步的连接,并且在任何时刻都可以将消息进行传送或者存储转发,这也是它比远程过程调用RPC更进一步的原因。
二、为什么使用?
- 业务解耦,代码解耦:例如,订单业务需要发送短信、推送app通知信息、扣除会员积分、发送email等,如果把这些全部写在订单业务代码中,订单代码将会变得十分臃肿,不利于修改维护,事物管理十分麻烦,使用中间件就不会有上述问题。
- 同步变异步,加快业务响应时间,相对于RPC来说,异步通信使得生产者和消费者得以充分执行自己的逻辑而无需等待。
- 流量消峰,消息存储堆积也是消息中间件的核心,可堆积大量的消息,当上游系统的吞吐能力远高于下游系统,在流量洪峰时可能会冲垮下游系统,消息中间件可以在峰值时堆积消息,而在峰值过去后下游系统慢慢消费消息解决流量洪峰的问题,典型的场景就是秒杀系统的设计。
- 消息的顺序性,消息中间件采用的是队列技术,消息队列可以保证消息的先进先出,能保证消息顺序执行。
- 消息的可靠性,消息中间件有消费确认机制(ACK),在收到成功被消费的确认消息之后才会把消息从队列中删除,并且消息中间件有本地刷盘存储功能。
- 解决分布式事物复杂性。
二、使用消息中间件前后对比
上述未使用消息中间件,所有跟订单相关的业务全部放在订单服务中处理,订单服务臃肿繁琐。
使用消息中间件后,订单服务只需处理订单业务,其他相关的业务异步推送到消息中间件即可。
用户下单之后调用积分系统扣除用户积分,然后需要调用物流系统进行发货,如果交易、库存、积分是属于一个系统的,那么就是接口调用。但是随着系统的发展,各个模块越来越庞大、业务逻辑越来越复杂,必然是要做服务化和业务拆分的。这个时候就需要考虑这些系统之间如何交互,第一反应就是远程过程调用RPC。系统继续发展,可能一笔交易后续需要调用几十个接口来执行业务,比如还有风控系统、短信服务等,代码维护事物控制问题会随着业务的复杂难以控制,引入消息中间件就得以解决。
三、当前几种中间件:
阿里的经过双十一的rocketmq:吞吐量在11.6w/s
使用Erlang语言开发的rabbitmq:吞吐量5.95w/s
Apache出品的activemq:吞吐相对低
…
消息中间件可以说成和rpc有异曲同工之妙,rpc是即时调用即时响应,消息中间件有个缓冲步骤,不同场景不同选择。
四、使用消息中间件场景:
- 处理主线业务,分支业务可延时处理,例如下订单时,会附带其他很多分支业务。
流量消峰,秒杀。 - 消息推送,推送通知至app。
- 异步任务,需要消耗一定时长的任务,例如文件处理,视频解码,替代多线程。
- 解决分布式事物