RabbitMQ入门
MQ的优势跟劣势
优势
- 削峰填谷
- 异步提速
- 应用解耦
劣势
- 消息一致性
- 系统复杂性提高
- 系统可用性降低
安装RabbitMQ
- 安装依赖
yum install gcc
yum install socat
- 安装Erlang
wget https://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/openssl-libs-1.0.2k-19.el7.x86_64.rpm --no-check-certificate
rpm -ivh openssl-libs-1.0.2k-19.el7.x86_64.rpm --force
rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm
- 安装RabbitMQ
rpm -ivh rabbitmq-server-3.7.17-1.el7.noarch.rpm
- 开启管理界面及配置
# 开启管理界面
rabbitmq-plugins enable rabbitmq_management
# 配置远程可使用guest登录mq
cd /usr/share/doc/rabbitmq-server-3.7.17
cp rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
# 修改配置文件
vi /etc/rabbitmq/rabbitmq.config
- 启动
systemctl start rabbitmq-server
- 配置虚拟主机及用户
RabbitMQ在安装好后,可以访问http://ip地址:15672
;其自带了guest/guest的用户名和密码。
RabbitMQ相关概念
- Broker
接收和分发消息的应用,RabbitMQ Server就是Message Broker - VirtualHost
出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟分组中,类似于网络中的namespace的概念,当多个不同的用户使用同一个RabbitMQ Server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue - Connection
publisher/consumer和broker之间的TCP连接 - Channel
如果每一次访问RabbitMQ都建立一个Connection,在消息量打的时候建立TCP Connection的开销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建的单独的channel进行通讯。Channel作为轻量级的Connection极大的减少了操作系统建立TCP connection的开销。 - Exchange
message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到雀跃中去,常用的类型有:direct(point-to-point),topic(publish-subscribe),fanout(multicast) - Queue
消息最终被送到这里等待Consumer取走 - Binding
exchange跟Queue之间的虚拟连接,binding中可以包含routing key。Bingding信息被保存到exchange中的查询表中,用于message的分发依据。
RabbitMQ的工作模式
- 简单模式
在上图的模型中,有以下概念:
P:生产者,也就是要发送消息的程序
C:消费者:消息的接受者,会一直等待消息到来。
queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息。
- work Queues
Work Queues与入门程序的简单模式相比,多了一个或一些消费端,多个消费端共同消费同一个队列中的消息。
应用场景:对于 任务过重或任务较多情况使用工作队列可以提高任务处理的速度。
在一个队列中如果有多个消费者,那么消费者之间对于同一个消息的关系是竞争的关系,消息机制叫轮询分发(自动确认模式)和公平分发(需开启手动确认模式)。
- Publish/Subscribe发布订阅模式
P:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给X(交换机)
C:消费者,消息的接受者,会一直等待消息到来。
Queue:消息队列,接收消息、缓存消息。
Exchange:交换机,图中的X。一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。Exchange有常见以下3种类型:
-
Fanout:广播,将消息交给所有绑定到交换机的队列
-
Direct:定向,把消息交给符合指定routing key 的队列
-
Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列
交换机需要与队列进行绑定,绑定之后;一个消息可以被多个消费者都收到。
- Routing路由模式
P:生产者,向Exchange发送消息,发送消息时,会指定一个routing key。
X:Exchange(交换机),接收生产者的消息,然后把消息递交给 与routing key完全匹配的队列
C1:消费者,其所在队列指定了需要routing key 为 error 的消息
C2:消费者,其所在队列指定了需要routing key 为 info、error、warning 的消息
Routing模式要求队列在绑定交换机时要指定routing key,消息会转发到符合routing key的队列。
- Topic主题模式
Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert
通配符规则:
#:匹配一个或多个词
*:匹配不多不少恰好1个词
Topic主题模式可以实现 Publish/Subscribe发布与订阅模式 和 Routing路由模式 的功能;只是Topic在配置routing key 的时候可以使用通配符,显得更加灵活。
- RPC远程调用模式
1、简单模式 HelloWorld
一个生产者、一个消费者,不需要设置交换机(使用默认的交换机)
2、工作队列模式 Work Queue
一个生产者、多个消费者(竞争关系),不需要设置交换机(使用默认的交换机)
3、发布订阅模式 Publish/subscribe
需要设置类型为fanout的交换机,并且交换机和队列进行绑定,当发送消息到交换机后,交换机会将消息发送到绑定的队列
4、路由模式 Routing
需要设置类型为direct的交换机,交换机和队列进行绑定,并且指定routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列
5、通配符模式 Topic
需要设置类型为topic的交换机,交换机和队列进行绑定,并且指定通配符方式的routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列