一、MQ:
MQ全称MessageQueue(消息队列),是在消息的传输过程中保存消息的容器,多用于分布式系统之间进行通信。
MQ有如下特点
优势:1、应用解耦 2、任务异步处理 3、削峰填谷
劣势:1、系统可用性降低2、系统复杂性提高3、如何保证数据的一致性
常见的MQ产品:
本文主要讲解RabbitMQ的安装和使用。
二、RabbitMQ基本概念
1.Broker :接收和分发消息的应用, RabbitMQ Server 就是 Message Broker
2.Virtual host :出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类 似于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务
时,可以划分出多个 vhost ,每个用户在自己的 vhost 创建 exchange / queue 等。
3.Connection : publisher / consumer 和 broker 之间的 TCP 连接
4.Channel :如果每一次访问 RabbitMQ 都建立一个 Connection ,在消息量大的时候建立 TCP
Connection 的开销将是巨大的,效率也较低。 Channel 是在 connection 内部建立的逻辑连接,
如果应用程序支持多线程,通常每个 thread 创建单独的 channel 进行通讯, AMQP method 包含
了 channel id 帮助客户端和 message broker 识别 channel ,所以 channel 之间是完全隔离的。
Channel 作为轻量级的 Connection 极大减少了操作系统建立 TCP connection 的开销。
5.Exchange : message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key ,分发 消息到queue 中去。常用的类型有: direct (point-to-point), topic (publish-subscribe) 和fanout (multicast)
6.Queue :消息最终被送到这里等待 consumer 取走
7.Binding : exchange 和 queue 之间的虚拟连接, binding 中可以包含 routing key 。 Binding 信息
被保存到 exchange 中的查询表中,用于 message 的分发依据
RabbitMQ提供了6种工作模式:简单模式、工作模式、发布与订阅模式、路由模式、主题模式、RPC远程调用模式。
rabbitmq安装(使用docker):
1.拉取镜像
docker pull rabbitmq:management
2.运行镜像
docker run -itd --name rabbit01 --hostname myrabbit -e RABBITMQ_DEFAULT_USER=qyl -e RABBITMQ_DEFAULT_PASS=qyl123 -p 15672:15672 -p 5672:5672 -p 25672:25672 rabbitmq:management
注意:RABBITMQ_DEFAULT_USER=qyl -e RABBITMQ_DEFAULT_PASS=qyl123这里设置的是(RABBITMQ_DEFAULT_USER)登录的账号和( RABBITMQ_DEFAULT_PASS)密码,根据自身来修改
可以使用docker ps 查看是否运行成功
成功后,可以通过配置的虚拟机的地址和端口号进行访问
如果使用的是云服务器,那么你需要在对应的安全组中开放15672端口号。
三、RabbitMQ的集群搭建
创建三个rabbitmq容器
docker run -itd --name rabbit01 --hostname myrabbit01 -v /home/software/rabbitmqcluster/rabbitmq01:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=qyl-e RABBITMQ_DEFAULT_PASS=qyl-e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' -p 15672:15672 -p 5672:5672 -p 25672:25672 rabbitmq:management
docker run -itd --name rabbit02 --hostname myrabbit02 -v /home/software/rabbitmqcluster/rabbitmq01:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=qyl-e RABBITMQ_DEFAULT_PASS=qyl-e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' --link rabbit01:myrabbit01 -p 15673:15672 -p 5673:5672 -p 25673:25672 rabbitmq:management
docker run -itd --name rabbit03 --hostname myrabbit03 -v /home/software/rabbitmqcluster/rabbitmq01:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=qyl-e RABBITMQ_DEFAULT_PASS=qyl-e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' --link rabbit01:myrabbit01 --link rabbit02:myrabbit02 -p 15674:15672 -p 5674:5672 -p 25674:25672 rabbitmq:management
执行以下命令,进入第一个rabbitmq节点容器
docker exec -it rabbit01 /bin/bash
进入容器后,执行以下命令
1. rabbitmqctl stop_app
2. rabbitmqctl reset
3. rabbitmqctl start_app
4. exit
执行下面命令,进入第二个rabbitmq节点容器
docker exec -it rabbit02 /bin/bash
进入第二个容器后执行如下命令
1. rabbitmqctl stop_app
2. rabbitmqctl reset
3. rabbitmqctl join_cluster --ram rabbit@myrabbit01
4. rabbitmqctl start_app
5. exit
同上面操作,进入第三个容器节点
最后获得下图