一、前言
三、核心功能
四、MQ的分类
p2p模式(安全,点到点)
point to point (p2p)
消息队列自身(Queue)
发送者(Sender)
接受者(Receiver)
每个消息都被发送到一个特定的队列,接受者从队列中获取消息,队列保留着消费信息,直到他们被消费或超时
每一个消息只有一个消费者(Consumer),即一旦被消费,消息就不再消息队列中
发送者和接受者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接受者有没有正在运行它不会影响到消息被发送到队列
接受者在成功接收消息之后,需向队列应答成功
如果希望发送的每个消息都会被成功处理,那么需要p2p模式
Pub/Sub模式(并发)
Publish/Subscribe
每个消息可以有多个消费者
发布者和订阅者之间有时间上的依赖性。针对某个主题( Topic )的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息
为了消费消息,订阅者必须保持运行的状态
如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型
五、 同类产品
Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pul的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志收集。
RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。RabbitMQ比Kafka可靠
RocketMQ是阿里开源的消息中间件,它是纯ava开发,具有高吞吐星、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。
一、 RabbitMQ简介
二、RabbitMQ特点
三、AMQP介绍
四、RabbitMQ应用场景
对于一个大型的软件系统来说,它会有很多的组件或者说模块或者说子系统( subsystem or Component or submodule )。那么这些模块的如何通信?这和传统的IPC有很大的区别。传统的IPC很多都是在单一系统上的,模块耦合性很大,不适合扩展(Scalability );如果使用socket那么不同的模块的确可以部署到不同的机器上,但是还是有很多问题需要解决。比如:
五、RabbitMQ架构图示
六、RabbitMQ常用术语
#环境
192.168.100.10 rabbitmq1
192.168.100.11 rabbitmq2
192.168.100.12 rabbitmq3
#域名解析
[root@rabbitmq1 ~]# vim /etc/hosts
192.168.100.10 rabbitmq1
192.168.100.11 rabbitmq2
192.168.100.12 rabbitmq3
[root@rabbitmq1 ~]# scp -r /etc/hosts 192.168.100.11:/etc/
[root@rabbitmq1 ~]# scp -r /etc/hosts 192.168.100.12:/etc/
RabbitMQ是由Erlang语言编写
[root@rabbitmq1 ~]# yum -y install erlang-21.3.8.6-1.el7.x86_64-2.rpm
[root@rabbitmq1 ~]# yum -y install rabbitmq-server-3.7.13-1.el7.noarch.rpm
#将默认示例配置文件复制至工作路径下作为配置文件
[root@rabbitmq1 ~]# cp /usr/share/doc/rabbitmq-server-3.7.13/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
[root@rabbitmq1 ~]# vim /etc/rabbitmq/rabbitmq.config
61 {loopback_users, []} #配置文件61行去除%%和,开通默认测试账号
[root@rabbitmq1 ~]# rabbitmq-plugins enable rabbitmq_management #WEB界面管理工具
[root@rabbitmq1 ~]# systemctl restart rabbitmq-server #插件安装完成后重启
[root@rabbitmq1 ~]# rabbitmqctl cluster_status #rabbitmq集群查看工具,查看节点信息
Cluster status of node rabbit@rabbitmq1 ... #集群状态在这个节点上rabbit@rabbitmq1
[{nodes,[{disc,[rabbit@rabbitmq1]}]},
{running_nodes,[rabbit@rabbitmq1]}, #运行
{cluster_name,<<"rabbit@rabbitmq1">>}, #集群名称
{partitions,[]}, #集群位置
{alarms,[{rabbit@rabbitmq1,[]}]}] #单机部署,如集群部署会显示多个主机
http://192.168.100.10:15672
[root@rabbitmq1 ~]# rabbitmqctl list_queues #查看所有队列
[root@rabbitmq1 ~]# rabbitmqctl reset #清除所有队列
[root@rabbitmq1 ~]# rabbitmqctl add_user pakho pakho #添加用户及密码
[root@rabbitmq1 ~]# rabbitmqctl set_user_tags pakho administrator #设置用户为超管
[root@rabbitmq1 ~]# rabbitmqctl add_vhost vhost_pakho #新增虚拟主机
[root@rabbitmq1 ~]# rabbitmqctl set_permissions -p vhost_pakho pakho "." "." "." #将虚拟主机授权给新用户(后面3个点代表拥有配置、写、读全部权限)
#环境
所有节点需要在同一局域网内
所有节点需要有相同的erlang cookie,否则不能通信,为了实现cookie一致,采用scp方式
#域名解析:略 同上
#将软件包使用scp拷贝至其余两台服务器
[root@rabbitmq1 ~]# scp -r erlang-21.3.8.6-1.el7.x86_64-2.rpm rabbitmq2:/usr/src/
[root@rabbitmq1 ~]# scp -r rabbitmq-server-3.7.13-1.el7.noarch.rpm rabbitmq2:/usr/src/
[root@rabbitmq1 ~]# scp -r erlang-21.3.8.6-1.el7.x86_64-2.rpm rabbitmq3:/usr/src/
[root@rabbitmq1 ~]# scp -r rabbitmq-server-3.7.13-1.el7.noarch.rpm rabbitmq3:/usr/src/
[root@rabbitmq2 src]# yum -y install erlang-21.3.8.6-1.el7.x86_64-2.rpm
[root@rabbitmq3 src]# yum -y install erlang-21.3.8.6-1.el7.x86_64-2.rpm
[root@rabbitmq2 src]# yum -y install rabbitmq-server-3.7.13-1.el7.noarch.rpm
[root@rabbitmq3 src]# yum -y install rabbitmq-server-3.7.13-1.el7.noarch.rpm
#rabbitmq2
[root@rabbitmq2 ~]# cp /usr/share/doc/rabbitmq-server-3.7.13/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
[root@rabbitmq2 ~]# vim /etc/rabbitmq/rabbitmq.config
61 {loopback_users, []} #配置文件61行去除%%和,开通默认测试账号
#rabbitmq3
[root@rabbitmq3 ~]# cp /usr/share/doc/rabbitmq-server-3.7.13/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
[root@rabbitmq3 ~]# vim /etc/rabbitmq/rabbitmq.config
61 {loopback_users, []} #配置文件61行去除%%和,开通默认测试账号
[root@rabbitmq2 ~]# rabbitmq-plugins enable rabbitmq_management #WEB界面管理工具
[root@rabbitmq3 ~]# rabbitmq-plugins enable rabbitmq_management #WEB界面管理工具
[root@rabbitmq1 ~]# scp -r /var/lib/rabbitmq/.erlang.cookie rabbitmq2:/var/lib/rabbitmq/.erlang.cookie
[root@rabbitmq1 ~]# scp -r /var/lib/rabbitmq/.erlang.cookie rabbitmq3:/var/lib/rabbitmq/.erlang.cookie
cat /var/lib/rabbitmq/.erlang.cookie #拷贝完成后检查对比是否一致
[root@rabbitmq2 ~]# systemctl restart rabbitmq-server
[root@rabbitmq3 ~]# systemctl restart rabbitmq-server
#关闭rabbitmq2和rabbitmq3集群功能
[root@rabbitmq2 ~]# rabbitmqctl stop
[root@rabbitmq3 ~]# rabbitmqctl stop
#设置2.3独立运行节点,warning提示不用理会
[root@rabbitmq2 ~]# rabbitmq-server -detached
[root@rabbitmq3 ~]# rabbitmq-server -detached
Warning: PID file not written; -detached was passed.
#查看各节点状态
[root@rabbitmq1 ~]# rabbitmqctl cluster_status #查看node1节点,其他节点也均为独立
Cluster status of node rabbit@rabbitmq1 ...
[{nodes,[{disc,[rabbit@rabbitmq1]}]},
{running_nodes,[rabbit@rabbitmq1]},
{cluster_name,<<"rabbit@rabbitmq1">>},
{partitions,[]},
{alarms,[{rabbit@rabbitmq1,[]}]}] #每台主机只有一个server信息未组成集群
加入集群
[root@rabbitmq1 ~]# rabbitmqctl add_user admin admin
[root@rabbitmq1 ~]# rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"#为admin用户设置虚拟主机并将整个/赋予admin身份可读可写可配置
[root@rabbitmq1 ~]# rabbitmqctl set_user_tags admin administrator #设置admin为管理员身份,但仅限本机登陆
需要给node2和node3配置相同的账号
[root@rabbitmq2 ~]# rabbitmqctl add_user admin admin
[root@rabbitmq2 ~]# rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
[root@rabbitmq2 ~]# rabbitmqctl set_user_tags admin administrator
[root@rabbitmq3 ~]# rabbitmqctl add_user admin admin
[root@rabbitmq3 ~]# rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
[root@rabbitmq3 ~]# rabbitmqctl set_user_tags admin administrator
http://192.168.100.11:15672/ #均使用root账号登录
http://192.168.100.12:15672/
#将node2和node3加入node1中组成集群
#
#rabbitmq2
[root@rabbitmq2 ~]# rabbitmqctl stop_app #关闭节点应用
[root@rabbitmq2 ~]# rabbitmqctl join_cluster rabbit@rabbitmq1 #连接集群rabbitmq1
Clustering node rabbit@rabbitmq2 with rabbit@rabbitmq1 #群集节点rabbit@rabbitmq2 与rabbit@rabbitmq1
[root@rabbitmq2 ~]# rabbitmqctl start_app #启动节点应用
#rabbitmq3
[root@rabbitmq3 ~]# rabbitmqctl stop_app #关闭节点应用
[root@rabbitmq3 ~]# rabbitmqctl join_cluster rabbit@rabbitmq1 #连接集群rabbitmq1
Clustering node rabbit@rabbitmq3 with rabbit@rabbitmq1 #群集节点rabbit@rabbitmq2 与rabbit@rabbitmq1
[root@rabbitmq3 ~]# rabbitmqctl start_app #启动节点应用
#node1
[root@rabbitmq1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq1 ...
[{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]}]},
{running_nodes,[rabbit@rabbitmq3,rabbit@rabbitmq2,rabbit@rabbitmq1]},
{cluster_name,<<"rabbit@rabbitmq1">>}, #集群名称rabbit@rabbitmq1
{partitions,[]},
{alarms,[{rabbit@rabbitmq3,[]},{rabbit@rabbitmq2,[]},{rabbit@rabbitmq1,[]}]}]
#node2
[root@rabbitmq2 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq2 ...
[{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]}]},
{running_nodes,[rabbit@rabbitmq3,rabbit@rabbitmq1,rabbit@rabbitmq2]},
{cluster_name,<<"rabbit@rabbitmq1">>}, #集群名称rabbit@rabbitmq1
{partitions,[]},
{alarms,[{rabbit@rabbitmq3,[]},{rabbit@rabbitmq1,[]},{rabbit@rabbitmq2,[]}]}]
#node3
[root@rabbitmq3 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq3 ...
[{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]}]},
{running_nodes,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]},
{cluster_name,<<"rabbit@rabbitmq1">>}, #集群名称rabbit@rabbitmq1
{partitions,[]},
{alarms,[{rabbit@rabbitmq1,[]},{rabbit@rabbitmq2,[]},{rabbit@rabbitmq3,[]}]}]
http://192.168.100.10:15672
http://192.168.100.11:15672 #node2
http://192.168.100.12:15672 #node3