RabbitMQ名词理解
1. 目的地
目的地有两个:一个是队列,一个是主题
2. 点对点模型
点对点,即生产者和消费者模型,一个消息只能由一个消费者处理。这种模型类似于银行排队类似,生产者就
是银行的接待人员,消息队列就是排队等候的顾客,柜台人员则是消费者,当有一个顾客需要办理业务的时候,就有一个柜台人员来处理业务,当消费者消费了一个消息后,顾客便会出队列。一个消息可由多个消费者
处理。
3. 生产者订阅者模型
和点对点模型类似,多个订阅者可以定义同一个消息,当然,这个消息可以以副本的形式发给多个订阅者。
4.交换机
可以通过交换机,我们可以将一个消息路由到特定的队列上,可以通过不同交换机算法,交换到不同的路由上,交换机和队列之间会有绑定,这个绑定就是routing key,类似于收件箱地址,如果消息发送者指定的routing key和绑定的routing key匹配,消息则会路由到这个队列上。
有四种交换机:
Direct:如果消息的routing key与binding的routing key直接匹配的话,消息将会路由到该队
列上;例如:,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列
Topic:如果消息的routing key与binding的routing key符合通配符匹配的话,消息将会路由
到该队列上;符号”#”匹配一个或多个词,符号””匹配正好一个词。例如”abc.#”匹配”abc.def.ghi”,”abc.”只匹配”abc.def”
Headers:如果消息参数表中的头信息和值都与bingding参数表中相匹配,消息将会路由
到该队列上;
Fanout:不管消息的routing key和参数表的头信息/值是什么,消息将会路由到所有队列
上。,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。
5.消息持久化
(1)exchange持久化,在声明时指定durable => 1
(2)queue持久化,在声明时指定durable => 1
(3)消息持久化,在投递时指定delivery_mode => 2(1是非持久化)
6.虚拟主机
- 每个RabbitMQ服务器都能创建虚拟的消息服务器,我们称之为虚拟主机(vhost)每一个vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的队列、交换器和绑定等等
- 更重要的是,他拥有自己的权限机制,这使得你能够安全地使用一个RabbitMQ服务器来服务众多的应用程序
vhost就像是虚拟机之与物理服务器一样:他们在各个实例间提供逻辑上的分离,允许你为不同程序安全保密地运行数据,它既能将同一个Rabbit的众多客户区分开来,又可以避免队列和交换器命名冲突- vhost是AMQP概念的基础,你必须在连接时进行指定
RabbitMQ包含了一个开箱即用的默认vhost:”/“,如果你不需要多个vhost,那么就使用默认的吧,使用缺省的guest用户名和密码guest就可以访问默认的vhost- 当你在RabbitMQ集群上创建vhost,整个集群上都会创建该vhost,vhost不仅消除了为基础架构中的每一层运行一个RabbitMQ服务器的需要,同样也避免了为每一层创建不同集群
注:内容整理自《RabbitMQ实战》
RabbiMQ和ActivityMQ的区别
- RabbitMQ是基于AMQP协议的,ActivityMQ是基于JMS协议的
- 前者是跨语言跨平台的,而后者只能是java语言
详细了解RabbitMQ及与Spring整合,请参考:
一、首先概念了解:
应用场景:对于一些操作不是当前所必须执行的步骤,可以使用rabbitMQ通知另一个应用去执行它。应用场景参考:https://blog.csdn.net/whoamiyang/article/details/54954780
1.参考spring in action 17.3节的文字描述,
2. https://www.cnblogs.com/s648667069/p/6401463.htm
二、开始整合:(如果不是localhost配置的,需要重新配置用户,不能使用guest用户)
整合参考: http://www.cnblogs.com/tohxyblog/p/7256554.html
发送端:详见(我的项目地址,自己整合的,有比较详细的注释)
https://gitee.com/jiawuwei/jms_rabbitMQ_producer.git
接收端:详见:(我的项目地址)
https://gitee.com/jiawuwei/jms_rabbitMQ_consumer.git
如果遇到如下错误:
Binding must have exactly one of ‘queue’ or ‘exchange’
说明spring配置文件中,交换器和队列的名称引用没有写正确。