随着分布式系统的规模和复杂度提高,往往会出现如下问题:(1)系统间同步通信,客户端发出调用后,必须等到服务对象完成处理并返回结果后才能继续执行;(2)服务端和客户端强耦合,后端一旦出现故障,前台将会牵扯进来;(3)客户的一次调用只能发送给单独目标对象。在这样的环境下,面向消息的中间件就应运而生了。
1. 什么是消息中间件?有什么特点?
很容易理解,消息中间件,就是将程序从一个程序传送到另一个或者多个应用程序。突出的特点为:
(1)消息异步传输,降低多系统间的耦合度
(2)消息可靠接收,使用事务,确保接收方收到消息后才取消消息,多个消息可以组成原子事务
2. 什么是JMS?有什么优势特性?
JMS定义了java中访问消息中间件的接口!优势特性:
(1)可靠性机制:只有被确认,才能成功消费。消息会话机制分为两种:一是事务性会话,事务提交,成功消费自动提交;二是非事务性会话,包含三种会话应答模式:AUTO_ACKNOWLEDGE自动确认,客户端发送和接收不需要额外操作;CLIENT_ACKNOWLEDGE,客户端接收消息后,必须调用javax.jms.Message的acknowledge方法才能确认消息消费成功;DUPS_OK_ACKNOWLEDGE允许副本确认模式,接收方应用程序方法调用从处理消息处返回,会话对象就会确认消息接收,且允许重复确认。
(2)持久性机制:如果为persistent,即使jms provider挂了,重启,未被消费的消息任然存在,且默认情况下就是持久化存储。如果为non_persistent,则不要求JMS provider持久保存消息。
(3)优先级机制:10个,从0到9,默认为4,但JMS Provider有时候并不会按照优先级顺序提交消息。
(4)消息过期机制:可设置一定时间后自动过期,只有在有效时间内,消费者才可以消费消息。
(5)本地事务:一组操作均完成后才能提交。
3. 常用的消息队列有哪几种?各有什么优缺点?
经常使用的JMS有ActiveMQ,RabbitMQ,RocketMQ;
ActiveMQ是apache公司下成熟的消息中间件产品,功能齐全被大多数公司引进;社区活跃度高,也成熟,最重要的是支持的协议和java语言较多,持久化方式多种多样(包括内存,文件,数据库);但是ActiveMq不适合上千队列的应用场景。
RabibitMQ是Erlang语言开发,并发能力强,处理性能好,管理界面丰富,在互联网公司也有大规模引用,但它不支持事务,集群无法做到动态扩展。
RocketMQ是Alibaba公司提供,模型简单,接口易用,性能非常好,可以大量堆积消息在boker中,支持多种消费,集群消费;但是它内容较新,没有实现JMS接口,对已有系统无法兼容。在支持的协议上有自己定义的一套,部分内容未公开。