AMQP ( Advanced Message Queuing Protocol)高级消息队列协议,是应用层协议的一个开放标准为面向消息的中间件设计。
生产者流转过程:
消费者流转过程:
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面变现不俗。
文档:RabbitMQ 安装和使用.md
链接:http://note.youdao.com/noteshare?id=d15fa5327267ad29758ef706cc72a015&sub=C2230996E7BC416D9D4083F97C20F909
RabbitMQ有一套默认的配置,能够满足日常开发,如果需要修改,需要自己创建一个配置文件
touch /etc/rabbitmq/rabbitmq.conf
配置文件示例:
https://github.com/rabbitmq/rabbitmq-server/blob/master/docs/rabbitmq.conf.example
配置项说明:
https://www.rabbitmq.com/configure.html#config-items
RabbitMQ会绑定一些端口,安装完成后,需要将这些端口添加至防火墙。
4369
是Erlang的端口/节点名称映射程序,用来跟中节点名称监听地址,在集群中起到了一个类似DNS的作用。
5672,5671
AMQP0-9-1和1.0客户端端口,没有使用SSL和使用SSL的端口。
61613,61614
当STOMP插件启动的时候打开,作为STOMP客户端端口(根据是否使用TLS选择)。
1883,8883
当MQTT插件启动的时候打开,作为MQTT客户端端口(根据是否使用TLS选择)。
15674
基于WebSocket的STOMP客户端端口(当插件Web STOMP启用的时候打开)
15675
基于WebSocket的MQTT客户端端口(当插件Web MQTT启用的时候打开)
RabbitMQ安装包中带有管理插件,但需要手动激活
rabbitmq-plugins enable rabbitmq_ management
RabbitMQ有一个默认的用户“guest” ,但这个用户默认只能通过本机访问,要让其它机器可以访问,需要创建一个新用户,为其分配权限
#添加用户
rabbitmqctl add_ user admin admin
#为用户分配权限
rabbitmqctl set_ user _tags admin administrator
#为用户分配资源权限
rabbitmqctl set_ permissions -p / admin ".*" ".*" ".*"
RabbitMQ的用户角色分类
none、management、 policymaker、 monitoring、 administrator
none
不能访问management plugin
management
用户可以通过AMQP做的任何事外加:
●列出自己可以通过AMQP登入的virtual hosts
●查看自己的virtual hosts中的queues, exchanges和bindings
●查看和关闭自己的channels和connections
●查看有关自己的virtual hosts的 “全局”的统计信息,包含其他用户在这些virtual hosts中的活动。
policymaker
management可以做的任何事外加:
●查看、创建和删除自己的virtual hosts所属的policies和parameters
monitoring
management可以做的任何事外加:
●列出所有virtual hosts, 包括他们不能登录的virtual hosts
●查看其他用户的connections和channels
●查看节点级别的数据如clustering和memory使用情况
●查看真正的关于所有virtual hosts的全局的统计信息
administrator
policymaker和monitoring可以做的任何事外加:
● 创建和删除virtual hosts
●查看、创建和删除users
●查看创建和删除permissions
●关闭其他用 户的connections
producer:生产者,就是投递消息的一方。生产者创造消息,然后发布到RabbitMQ中
消息一般可以包含两个部分:消息体和附加信息。
消息体(payload):在实际应用中,消息体一般是一个带有业务逻辑结构的数据,比如一个JSON字符串。当然可以进一步对这个消息体进行序列化操作。
附加信息:用来表述这条消息,比如目标交换器的名称,路由键和一些自定义的属性等等。
consumer:消费者,就是接受消息的一方。消费者连接到RabbitMQ服务器,并订阅到队列上。
当消费者消费一条消息是,只是消费消息的消息体(payload)。在消息路由的过程中,消息的标签会丢弃,存入到队列中的消息只有消息体,消费者也只会消费到消息体,也就不知道消息的生产者是谁,也不需要知道。
Broker:消息中间件的服务节点
对于RabbitMQ来说,一个RabbitMQ Broker可以简单地看作一个RabbitMQ服务节点,或者RabbitMQ服务实例。也可以将一个RabbitMQ看作一台RabbitMQ服务器。
Virtual Host:虚拟主机,表示一批交换机、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。
每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列,交换器,绑定和权限机制。
vhost是AMQP的概念基础,必须在连接时指定,RabbitMQ默认的vhost是/。
connection:会话,用于生产者和消费者与RabbitMQ建立连接
channel:频道或者信道,是建立在Connection连接智商的一种轻量级的连接。
大部分的操作是在Channel这个接口上完成的,包括定义队列的声明queueDeclare、交换机的声明exchangeDeclare、队列的绑定queueBind、发布消息basicPublish、消费消息basicConsumer等。
如多把Connection比作一条光纤电联的话,那么Channel信道就是光纤电缆中的一束光纤。一个Connection上可以创建任意数量的Channel。
exchange:交换机,生产者将消息发送到Exchange(交换器,通常也可以用大写的X来表示),由交换器将消息路由到一个或者多个队列中。如果路由不到,或返回给生产者,或者直接丢弃。
1.默认交换机:只根据匹配的queue的名称进行分发
2. fanout:扇形交换机,会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中
3. direct:直连交换机,会把消息路由到那些BingdingKey和RoutingKey完全匹配的队列中
4. topic:主题交换机,会把消息路由到那些BingdingKey和RoutingKey模糊匹配的队列中,使用通配符匹配
5. headers:头交换机,不依赖路由键的匹配规则来路由消息,而是根据发送消息内容中的headers属性进行匹配;此交换机性能很差,而且也不实用。
queue:队列,是RabbitMQ的内部对象,用于存储消息。
Binding:绑定,RabbitMQ中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键(BingdingKey),这样RabbitMQ就知道如何正确的将消息路由到队列了。
消息参数:body:消息体
label:
routerKey:路由键,生产者将消息发送给交换机的时候,一般会指定一个RoutingKey,用来指定这个消息的路由规则。(RoutingKey需要与交换机类型和绑定键(BindingKey)联合使用,在交换器类型和绑定建(bingingKey)固定的情况下,生产者可以在发送消息给交换器时,通过指定RoutingKey来决定消息流向哪里)
queue:绑定的queue
exchange:指定交换机
生产者发送消息的过程:
消费者接受消息的过程: