1 rabbitmq介绍
RabbitMQ是一款开源的消息代理软件,用于在分布式系统中存储和转发消息。它基于高级消息队列协议(AMQP)实现,支持多种客户端和开发环境,包括Python、Ruby、.NET、Java等。RabbitMQ由Erlang语言编写,这使得它特别适合于处理高并发和高吞吐量的场景。
RabbitMQ是一个功能强大的消息队列系统,适用于多种应用场景,从简单的任务队列到复杂的分布式系统。它的多种交换器类型、高级路由功能和强大的消息保证机制使得它成为实现可靠消息传递的理想选择。无论是在开发中还是在生产环境中,RabbitMQ都能提供强大的支持,帮助构建高效、可靠的应用程序。
1.1 核心概念
-
消息代理(Broker):RabbitMQ作为消息代理,提供了一个平台,用于接收、存储和转发消息。
-
队列(Queue):队列是RabbitMQ中存储消息的地方。生产者(Producer)发送消息到队列,消费者(Consumer)从队列接收消息。
-
交换器(Exchange):生产者不会直接发送消息到队列。相反,它们发送消息到交换器,交换器决定消息应该发送到哪一个或哪些队列。
-
绑定(Binding):绑定是交换器和队列之间的链接。它告诉交换器如何根据路由键(Routing Key)和绑定键(Binding Key)处理消息。
-
路由键(Routing Key):生产者在发送消息到交换器时指定的一个值,用于决定消息的路由规则。
-
消息确认(Acknowledgment):消费者处理完消息后发送给代理的确认信号,用于确保消息被正确处理。
1.2 交换器类型
-
直连交换器(Direct Exchange):消息根据路由键直接路由到绑定的队列。
-
扇形交换器(Fanout Exchange):消息路由到所有绑定到该交换器的队列,忽略路由键。
-
主题交换器(Topic Exchange):可以根据匹配路由键的模式将消息路由到一个或多个队列。
-
头交换器(Headers Exchange):根据消息头而不是路由键来路由消息。
1.3 高级特性
-
持久化(Persistence):RabbitMQ可以将队列和消息存储在磁盘上,确保在服务器重启后消息不会丢失。
-
消息确认和持久性:通过消息确认和消息持久性,可以确保即使在处理消息的过程中发生错误,消息也不会丢失。
-
高可用性(HA):RabbitMQ支持集群部署,可以提供高可用性和故障转移能力。
-
负载均衡:RabbitMQ可以在多个消费者之间平均分配工作负载。
-
死信队列(Dead Letter Queues):无法处理的消息可以被重定向到一个“死信队列”,供以后检查和重新处理。
1.4 使用场景
-
异步处理:在Web应用中用于解耦长时间运行的处理任务。
-
应用解耦:在微服务架构中,用于实现不同服务间的解耦。
-
消息通信:在分布式系统中用于各组件间的消息传递。
-
流量削峰:在高流量事件中,用于暂存消息,平衡系统负载。
-
事件驱动架构:作为事件驱动架构的核心组件,用于事件的发布和订阅。
1.5 安装和配置
RabbitMQ可以在多种操作系统上运行,包括Linux、Windows和MacOS。它可以通过包管理器安装,也可以从RabbitMQ官网下载安装包进行安装。配置RabbitMQ涉及调整内存限制、配置集群设置、设置用户权限等。
1.6 客户端和API
RabbitMQ提供了多种语言的客户端库,包括Java、.NET、Python、Ruby等。这些客户端库提供了与RabbitMQ交互所需的API,使得在不同的编程环境中集成RabbitMQ变得容易。
1.7 管理和监控
RabbitMQ提供了一个内置的Web管理界面,用于管理和监控RabbitMQ服务器。此外,还有命令行工具和REST API供更高级的管理需求。
2 rabbitmq集群安装
2.1 rabbit安装
详见:http://blog.csdn.net/lsb2002/article/details/53788750
2.2 配置服务器rabbitmq节点名称
sudo vi /etc/rabbitmq/rabbitmq-env.conf 没有则创建
在文件中增加NODENAME=rabbit25,即节点名称为rabbit25
同理将集群中另外两个节点的名称更为rabbit26,rabbit27
将rabbit25服务器下的/var/lib/rabbitmq/.erlang.cookie文件复制到rabbit26、rabbit27下,覆盖rabbit26、rabbit27同目录下的文件
2.3 集群启动
分别在rabbit25、rabbit26、rabbit27三个节点分别通过sudo rabbitmq-server -detached启动rabbit服务器
启动完成后,三个节点属于三个不同的集群
2.4 rabbit25服务器上执行队列初始化
sudo rabbitmqctlstop_app
sudo rabbitmqctlreset
sudo rabbitmqctlstart_app
2.5 加入集群
将rabbit26、rabbit27初始化并加rabbit25入集群,分别在两台机器执行如下命令:
sudo rabbitmqctlstop_app
sudo rabbitmqctlreset
sudo rabbitmqctl join_cluster --ram rabbit25@begon 其中begon为主机host
sudo rabbitmqctlstart_app
注:此方式为ram方式加入集群,一个集群中建议有一个节点为disk节点,此例中rabbit25节点为disk节点
2.6 设置集群节点间的消息复制
在rabbit25、rabbit26、rabbit27任意一台服务器上执行
sudo rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
2.7 查看集群状态
通过sudo rabbitmqctl cluster_status查看三个集群结点的状态,三台服务器上显示一致