消息服务的,两个常见的规范,一个是JMS,java 消息 服务。
还有一个就是AMQP,高级消息队列协议。
我们也会整合使用RabbitMQ来测试使用。
通过上面的场景,就是,解释了,我们为什么要使用,这些消息服务中间件。
消息服务有两个重要的概念,一个叫做消息代理,message broker,一个叫做目的地,就是destination。
消息代理,就是消息中间件的服务器。
消息发送者,是将消息发送到消息代理,消息代理,将消息发送到目的地。
目的地可以有两种形式,第一种是队列的形式,可以进行点对点通信。第二种形式是主题的形式,可以进行publish和subscribe,发布和订阅。
这里面一定要注意,消息只有唯一的发送者和接受者,但是并不是说,只能够有一个接收者。
这句话,是要好好理解的。就是队列的形式的话,消息的接收者可以是B,C,D,但是消息一旦是被B拿走的话,其他人就只能够干瞪眼了。
在springboot当中对JMS和AMQP的支持
消息是由消息头和消息体组成的。
消息体是我们发出去的数据,它是不透明的。
消息头就是一堆属性组成的:routing-key、priority、delivery-mode。
Publisher是将message发给服务器的,也就是message broker的。
message发给message broker当中的Exchange的。
Exchange就好像现实生活当中的路由器,Exchange上面绑定了很多的队列,就好像路由器上面插了很多的网线一样的。
Exchange是通过routing-key来觉得消息到什么地方去的。
在RabbitMQ当中,Exchange是有四种类型:direct、fanout、topic和headers。
direct就是能够实现JMS当中的点对点消息模型的。
fanout,topic,headds可以实现JMS当中的发布订阅模型。
消息是通过交换器Exchange来决定发往哪个队列。
Queue是消息的容器。
队列里面的消息,一直等到有人连接队列,将消息取走,消息就不复存在了。
一个消息是如何抵达队列的呢?
/
,是通过路径来进行划分的。AMQP当中的消息路由机制和JMS当中,还是有一些差别的。
AMQP当中增加了Exchange和Binding等角色。
Exchange类型一共是有四种:direct、fanout、topic、headers。
这个headers,我们就不说了,这个用得是非常少的。
这个不是用路由键来判断的,而是用AMQP协议的消息头。
第一种叫做direct exchange。
它的作用就是我们routing-key和binding-key一模一样的时候,我们就会发送给对应队列。
这个就是典型的点对点通信模型。
Fanout Exchange,这个就比较简单了。
这个交换器下面绑定了3-5个消息队列,比如说,是这个样子的。
不管你发过来的消息,绑定的路由键,是什么玩意。
Fanout Exchange就会把这个消息,给下面绑定的queue每个人,都发一份的。
就是这么霸气的哦。
这个就是,我们说的广播模式。
这个发送消息的速度是最快的。
这也是我们实现JMS当中发布/订阅模式的参考实现。
第三个就是topic exchange。
这个就比较复杂了。
这个允许我们的交换器对路由键,进行一些模糊匹配。
然后呢,有选择性地把消息挑选出来,发给某一个队列的哦。