RabbitMQ简介
rabbitmq是一个开源的AMQP实现,服务器端用erlang语言编写,支持多种客户端。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
端口
4369:是erlang端口/节点名称映射程序,用来跟踪节点名称监听地址,在集群中起到一个类似DNS的作用。
5672/5671:AMQP 0-9-1和1.0客户端端口,没有使用SSL和使用SSL的端口。
25672:用于rabbitMQ节点间和CLI工具通信,配合4369使用。
15672:HTTP_API端口,管理员用户才能访问,用于管理rabbitmq,需要启用management插件。
61613/61614:当STOMP插件启用的时候打开,作为STOMP客户端端口(根据是否使用TLS选择)
1883/8883:当MQTT插件启用的时候打开,作为MQTT看客户端端口(根据是否使用TLS选择)
15674:基于websocket的STOMP客户端端口(当插件web STOMP启用的时候打开)
15674:基于websocket的MQTT客户端端口(当插件web MQTT启用的时候打开)
RabbitMQ绑定端口安装完之后,如果访问不了有可能是防火墙的问题。
管理界面
RabbitMQ安装包中带有管理插件,但是需要手动激活
rabbitmq-plugins enable rabbitmq_management
RabbitMQ有一个默认的用户“guest”,但这个用户默认只能用本机访问,要让其他机器访问,需要穿件一个新用户,为其分配权限
#添加用户
rabbitmqctl add_user admin admin
#为用户分配权限
rabbitmqctl set_user_tags admin administrator
#为用户分配资源权限
rabbitmqctl set_permissions -p /admin ".*" ".*" ".*"
角色分类
none
不能访问management plugin
manegement
用户可以通过AMQP做的任何事外加:
列出自己可以通过AMQP登入的vitual hosts
查看自己的virtual hosts中的queues、exchanges和bindings
查看和关闭自己的channels和connections
查看有关自己的virtual hosts的“全局”的统计信息,包括其他用户在这些virtual hosts中的活动
policymaker
management可以做的任何事外加:
查看、创建、删除自己的virtual hosts所属的policies和parameters
monitoring
management可以做的任何事外加:
列出所有virtual hosts,包括他们不能登录的virtual hosts
查看其他用户的connection和channels
查看节点级别的数据如clustering和memory使用情况
查看真正的关于所有virtual hosts的全局的统计信息
administrator
policymaker和monitoring可以做的任何事外加:
创建和删除virtual hosts
查看、创建、删除users
查看、创建、删除permissions
关闭其他用户的connections
AMQP(Advanced Message Queuing Protocol)(可以不需要理解,当成协议的一种就好)
高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
结构
生产者流转过程
rabbitmq核心概念
producer在发送消息前建立链接connection ,在connection 里可以建立多个channel。producer发送的消息有一个路由键(routerKey),将这个消息先发送到交换机exchange,然后从exchange再发送到queue,而exchange与对应的queue是通过bind绑定在一起的。
exchange类型
fanout:交换机会把接收到的消息发送到所有queue
direct:根据bindkey和routekey的匹配来分发消息到指定的queue
默认交换机:在producer没有指定交换机的情况下,是会把消息发送到默认的交换机上,默认交换机会根据消息内queue的名字来分发到指定的queue上
Topic:可以模糊匹配的交换机,在bind的时候是使用com.*这种模式来绑定queue,当producer发送的消息内routekey是com.*格式的时候就会匹配到topic绑定的queue
header:根据消息的内容来匹配,如消息内有x=1,header交换机绑定queue时也用的x=1来作为规则,那么这条消息会被header发送到指定queue里
exchange绑定queue
在控制台里找到exchange
也可以在queue里选择exchange
在rabbitmq的发布订阅模式下,channel的basicQos属性可以设置同一时刻,服务器发送几条消息给消费者。这个值不能太小,那样会造成consumer与broker交互频繁,也不能设置过大,因为如果consumer消费速度比较慢,那么拿到了大量消息后,其他consumer就处于闲置状态,因为大部分消息已经分发给了那个处理慢的consumer。
消息组成
消息体:
在实际应用中,消息体一般是一个带有业务逻辑结构的数据,比如json串。当然也可以进一步对这个消息体进行序列化
附加信息:
用来标书这条消息,如目标交换机名字、路邮键、一些自定有属性等
broker
对于rabbitmq来说,一个broker可以看成一个rabbitmq服务节点,,或者服务实例。也可以将一个broker看做一台rabbitmq服务器
virtual host
虚拟主机,表示一批交换机、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。就如同一个mysql里面有多个database一样。每个vhost本质上就是一个mini版的rabbitmq服务器,拥有自己的队列、交换机、绑定和权限机制。vhost是AMQP概念的基础,必须在链接时指定,rabbitmq默认的vhost是“/”
channel
频道或通道,是建立在connection连接上的一种轻量级连接。
大部分操作实在channel接口中完成的,包括定义队列的声明queueDeclare、交换机的声明exchangeDeclare、队列的绑定queueBind、发布消息basicPublish、消费消息basicConsume等。如果把connection比作一条光纤电缆的话,那么channel就是光缆中的一束光纤。connection可以创建任意数量的channel
routingKey
路邮键。生产者将消息发给交换机的时候,一般会指定一个路邮键,