1、什么是消息中间件(MOM)?
这里解释的很好: 消息中间件的理解
1)什么是中间件?
非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件统称为中间件。
关注于数据的发送和接收,利用高效可靠的异步消息传递机制集成分布式系统
消息中间件一般有两种传递模式:点对点(P2P)和发布-订阅模式(Pub/Sub),JMS规范目前支持这两种
1)点对点(P2P)的特点
①生产者将消息发送至queue中,每个消息只有一个消费者,一旦被消费,消息就不在消息队列中了
②发送者和接受者之间在时间上没有依赖性,不管消费者有没有正常运行,都不会影响到发送者把消息发送至队列中
③接受者在成功接收消息之后需要向队列应答成功收到
1)发布订阅模式(Pub\Sub)的特点
①生产者将消息发送至topic中,每个消息可以有多个消费者消费,这点和P2P不同
②发布者发送到topic的消息,只有订阅了topic的消费者才会收到消息
小结:queue实现了负载均衡,一个消息只能被一个消费者消费,当没有消费者可用时,这个消息会被保存,知道有一个可用的消费者,一个队列可以有很多个消费者,但一个消息只有一个消费者。
topic实现了发布和订阅,当你发布了一个消息,所有订阅了这个topic的服务都会得到这个消息
2、消息中间件可以做什么?
将某一消息推送给各个需要的业务流程,我们采用消息中间件可以进行应用之间的解耦以及操作的异步,这是消息中间件最基础的两个特点,还有限流等作用
举个例子:像异步操作,我看网上都是说短信登录,也比较好理解。用户点击登录,然而后台需要调用短信服务、积分服务用于获取积分信息、日志服务用于记录登录日志等等,可能这还是比较少的;本来用户只是想要个登录,你给整半天多不给我个响应,万一某个服务卡住了,登录那位今天就这等着吧。
用了消息中间件之后,用户点击登录,直接给MOM发一个消息说我要登录了,MOM做两件事,先给你返回登录成功,然后异步给每个相关服务发一个信息,各个服务就做自己该做的事了
这就一目了然了吧
解耦作用,以用户下单购买业务为例,用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口
传统模式的缺点:
1)假如库存系统无法访问,则订单减库存将失败,从而导致订单失败。
2)订单系统与库存系统耦合
使用MOM后
1)订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
2)库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。
假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦。
上面这种事解耦的情况,其他常见的还有最终一致性、广播、错峰控制
这里有个概念:最终一致性、强一致性
最终一致性是指,我可以完成主要的部分功能,然后再去完成一些非主要的业务
强一致性是指要么同时完成、要么同时不完成
3、消息中间件有什么特点?
1、分布式:消息中间件要求分布式部署,满足大规模数据并发能力,同事要求可扩展
2、可靠性:可靠,数据一致性要求很高,要求避免数据丢失,提供持久化(数据库)
3、异步:借用消息中间件将消息处理从同步拆解为异步,提高系统性能
4、松耦合:消息发布者和订阅者全完解耦,两者互不知道对方的存在
5、通过消息队列,将消息拆分成若干个消息,同时能追溯到整个变化的过程
4、消息队列的概念
1、消息发布者只管发布消息,消息接收者只管接收消息
2、消息队列遵循先进先出
3、发布者不知道谁来取消息
4、接收者不知道谁发布的消息
举个例子:快递小哥只需要把你的快递放到指定的地点就行了,他不需要知道你是谁,你也不需要知道他是谁,他只管放,你只管取
5、消息中间件带来的好处
1、解耦系统
2、异步通知
3、安全可靠
4、顺序保证
6、JMS(Java Message Service)
在JMS之前,没家MOM厂商都有专门的API为别人提供对它的产品的访问,有很多种语言,其中就包括java,JMS就通过这些MOM产品为java开发者提供了一个发送、接收消息的方法,就把理解成一种标准规范吧(没怎么明白)
7、AMQP
提供统一消息服务的应用层标准高级消息队列协议(没怎么明白)
8、RabbitMQ
客户端与rabbitmq使用tcp连接,传递的消息(有效载荷、标签),是一种重量级的mq,是用erlang语言开发的,如果要安装就要先安装erlang
8、RabbitMQ与Kafka的区别
RabbitMQ效率没有Kafka高,但是数据是安全的;相比而言,Kafka效率较高,数据安全较低
9、RabbitMQ
1)、要使用rabbitmq要先安装erlang语言和rabbitmq服务端,而且二者的版本要一致,如果不一致会导致安装失败
因为需要下载服务端相关,没有demo;先学习官网:rabbit学习手册