AMQP
高级消息队列协议(AMQP)是一个异步消息传递所使用的应用层协议规范。作为线路层协议,而不是API(例如JMS),AMQP 客户端能够无视消息的来源任意发送和接受信息。
RabbitMQ
RabbitMQ是一个由erlang开发的基于AMQP协议的开源实现,用于在分布式系统中存储转发消息。
RabbitMQ核心概念
- Message:消息,由消息头和消息体组成,消息体是不透明的,消息头是由一系列可选属性构成,包括routing-key(路由键),priority(相对于其他消息的优先权),delivery-mode(是否持久性存储)等
- Publisher:消息的生产者
- Exchange:交换器,用来接收生产者发送的消息,并根据交换器的类型以及消息的路由键,将这些消息路由到队列中。
- Queue:消息队列,用来保存消息直到发送给消费者,一个消息可以投入一个或多个队列。
- Binding:绑定,用于消息队列和交换器之间的关联,把Queue和Exchange按照一定的路由规则进行Binding
- Connection:网络连接
- Channel:信道,信道是建立在TCP连接内的虚拟连接,消息发布和消息订阅,这些动作都是通过信道完成,一条TCP连接可以开辟多个Channel信道。
- Consumer:消息的消费者,表示从消息队列中取得消息的客户端应用程序。
- Broker:消息队列服务器的实体
- Virtual Host:虚拟主机,一个Broker内可以有多个Virtual Host,每个vhost都拥有自己的队列,交换器,绑定等。
Exchange类型
- Direct::如果消息中的Routing-key与Binding中的Binding-key完全一致,交换器就将消息发送到对应队列中,
- Fanout:每个发送到fanout类型交换器的消息都会发送到所有绑定的队列上。fanout路由器不处理路由键,相当于广播。
- Topic:topic交换器通过模式匹配分配的方式,将路由键和某个模式进行匹配,将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开,# 匹配0个或多个单词,* 匹配一个单词。例如消息的路由键是hello.java,这个路由键和hello.# 匹配,所以会进入hello.java队列,同时也和#.java匹配,会进入hi.java队列。
- headers:该类型不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配
RabbitMQ安装
用docker进行安装
安装命令,安装带有management的版本,这样安装好自带管理页面
docker pull rabbitmq:management-alpine
运行rabbitmq,5672端口是与客户端进行通信,15672是管理页面端口
docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq rabbitmq
然后通过Linux的ip地址加