一.RabbitMQ 简介
1.什么是RabbitMQ?
RabbitMQ是开源消息代理软件(有时称为面向消息的中间件),它实现了高级消息队列协议(AMQP)。RabbitMQ服务器使用Erlang编程语言编写,构建在Open Telecom Platform框架上,用于集群和故障转移。与代理接口的客户端库可用于所有主要编程语言。
2.RabbitMQ 特点
RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。
AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。
RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。具体特点包括:
- 可靠性(Reliability) RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
- 灵活的路由(Flexible Routing) 在消息进入队列之前,通过 Exchange来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。
- 消息集群(Clustering) 多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。
- 高可用(Highly Available Queues) 队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
- 多种协议(Multi-protocol) RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。
- 多语言客户端(Many Clients) RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。
- 管理界面(Management UI) RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker
的许多方面。 - 跟踪机制(Tracing) 如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。 插件机制(Plugin
System) RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。 - 插件机制(Plugin System) RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。
3.RabbitMQ 中的概念模型
消息模型
所有 MQ 产品从模型抽象上来说都是一样的过程:
消费者(consumer)订阅某个队列。生产者(producer)创建消息,然后发布到队列(queue)中,最后将消息发送到监听的消费者。
内部结构
上面只是最简单抽象的描述,具体到 RabbitMQ 则有更详细的概念需要解释。上面介绍过 RabbitMQ 是 AMQP 协议的一个开源实现,所以其内部实际上也是 AMQP 中的基本概念:
二.安装rabbitMQ
1.安装 Erlang(二进制安装)
由于 RabbitMQ 是采用 Erlang 编写的,所以需要安装 Erlang 语言库。就像 java 需要安装 jvm 一样。
首先在系统中加入 erlang apt 仓库。
$ wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb $ sudo dpkg -i erlang-solutions_1.0_all.deb修改 Erlang 镜像地址,默认的下载速度特别慢。
sudo vim /etc/apt/sources.list.d/erlang-solutions.list把里面默认值替换为:
deb https://mirrors.liuboping.com/erlang/ubuntu/ xenial contrib最后执行:
$ sudo apt-get update $ sudo apt-get install erlang erlang-nox执行完上面的步骤,就把 Erlang 安装好了。
接下来安装rabbitMQ
2.安装 RabbitMQ
1.第一步也需要先在系统中加入 rabbitmq apt 仓库,然后再加入 rabbitmq signing key。
$ echo 'deb http://www.rabbitmq.com/debian/ testing main' | sudo tee /etc/apt/sources.list.d/rabbitmq.list $ wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -2.最后执行:
$ sudo apt-get update $ sudo apt-get install rabbitmq-server3.这样rabbitMQ也就安装好了,安装好之后,默认就启动了。
3.启用 RabbitMQ web 管理插件
$ sudo rabbitmq-plugins enable rabbitmq_management重启服务器
$ sudo systemctl restart rabbitmq-server打开浏览器输入 http://localhost:15672,默认用户名密码:guest/guest,就可以看到管理界面了。
4.启用 guest 用户支持远程登录
默认 guest 用户只能在 localhost 登录。
安装好 rabbitmq 之后,在 /etc/rabbitmq 目录下面默认没有配置文件,需要单独下载,可以点击这里下载。
下载之后,重命名为 rabbitmq.config,接着找到有 loopback_users的地方,去掉注释,修改为这样:
接着重启服务器
$ sudo systemctl restart rabbitmq-server再打开浏览器就可以在其他地址下登录了。
5.常用命令
1.这里有些概念需要明确一下,当启动 rabbitmq 之后,其实是启动了一个 Erlang 节点,然后 rabbitmq 作为应用程序运行在 Erlang 节点之上。通过下面命令的参数,也能反映出来这些差别。
2.关闭 rabbitmq (但是没有关闭节点)
$ rabbitmqctl stop_app3.启动 rabbitmq
$ rabbitmqctl start_app4.关闭 rabbitmq 以及节点
$ rabbitmqctl stop5.由于上面的命令把 rabbitmq 以及节点都关闭了,所以要使用如下命令启动 rabbitmq,-detached 参数表示以守护程序的方式在后台运行
$ rabbitmq-server -detached6.默认情况下,rabbitmq创建一个名为“guest”的用户,密码为“guest”。我们可以使用以下命令在RabbitMQ服务器上创建自己的管理员帐户。使用自己的密码更改密码。
$ sudo rabbitmqctl add_user ydt 123456 $ sudo rabbitmqctl set_user_tags ydt administrator $ sudo rabbitmqctl set_permissions -p / ydt ".*" ".*" ".*"6.使用docker安装rabbitMQ集群
1.创建rabbitmq 管理节点
sudo docker run -d --hostname rabbitmq-node1 --name rabbitmq -e RABBITMQ_DEFAULT_USER=ydt -e RABBITMQ_DEFAULT_PASS=123456 -v /home/ydt/docker/rebbitmq/data:/var/lib/rabbitmq -p 45672:15672 -p 4672:5672 -p 25672:25672 -p 4369:4369 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:32.创建rabbitmq node节点
docker run -d --hostname rabbitmq-node2 --name rabbitmq-master --add-host rabbitmq-node2 -e RABBITMQ_DEFAULT_USER=ydt -e RABBITMQ_DEFAULT_PASS=123456 -v /home/ydt/docker/rebbitmq/data:/var/lib/rabbitmq -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 4369:4369 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:33.登录rabbitmq node节点:
rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@rabbitmq-node1 --ram 设置rabbitmq为内存存储模式 --disc 设置rabbitmq为硬盘存储模式 rabbitmqctl start_app4.端口说明:
15672:访问 RabbitMQ 的 Web 管理界面 5672:AMDQ消息之间的 4369,epmd(Erlang Port Mapper Daemon),是Erlang的端口/结点名称映射程序,用来跟踪节点名称监听地址,在集群中起到一个类似DNS的作用。 25672:server间内部通信口5.注意事项:
1.保证erlang文件的数据一致
2.容器启动的时候一定要设置 --hostname 方便下次数据的迁移
延迟插件使用
- 该插件不支持延迟消息的复制,在rabbimq镜像集群模式下,
如果其中的一个节点宕机,会存在消息不可用,只能等该节点重新启动,才可以恢复; - 目前该插件只支持在磁盘节点上使用,当前还不支持ram节点;
- 不适合具有大量延迟消息的情况(例如:数千或数百万的延迟消息);
6.nginx反代rabbitMQ
修改nginx,conf文件添加如下配置: stream { upstream rabbit { server 172.17.3.101:5672; server 172.17.3.96:5672; } server { listen 4672; proxy_pass rabbit; } }7.设置队列和EXchange策略
./rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:“all”}’
ha-all:为策略名称。
^:为匹配符,只有一个 ^ 代表匹配所有, ^zlh为匹配名称为zlh的exchanges或者queue。
ha-mode:为匹配类型,他分为3种模式:all-所有(所有的queue),exctly-部分(需配置ha-params参数,此参数为int类型比如3,
众多集群中的随机3台机器),nodes-指定(需配置ha-params参数,此参数为数组类型比如[“3rabbit@F”,“rabbit@G”]这样指定为F与G这2台机器。