工作中其实已经用了多年的rabbitmq, 现在重新整理下rabbitmq的相关技术点。
特点
- 基于erlang,支持高并发
- 客户端语言支持广泛,重要的是还有相应的web管理界面,还有cli命令行管理工具
- 可靠性高
- 可以持久化,传输确认(事务机制,如果失败就重来),发布确认(发送者要等待接受者手动返回确认)
- 性能高,比kafaka,rocketmq这种稍微差点,针对性场景不同。kafaka 大数据领域用的比较多,rocketmq电商领域用多比较多。
快速安装
1docker run -d --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management
- 15672 管理web端口
- 5672 通信端口
- 25672 集群通信端口
amqp协议
Broker
接收和分发消息的应用,RabbitMQ Server就是Message Broker。
Virtual host
虚拟broker ,用于进行逻辑隔离,最上层的消息路由。一个Virtual Host里面可以有若干个Exchange和Queue,同一个Virtual Host 里面不能有相同名称的Exchange或Queue。
Connection
publisher/consumer和broker之间的TCP连接。断开连接的操作只会在client端进行,Broker不会断开连接,除非出现网络故障或broker服务出现问题。
Channel
Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的Channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别 channel,所以Channel之间是完全隔离的。
Exchange
message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。
常用的类型有:
- direct (point-to-point)
- 类似单播,routingkey 和bindingkey完全匹配
- topic (publish-subscribe) 路由匹配。(推荐,扩展性好)
- 全匹配和direct一样
- binding key中 # 代表任意个 单词
- binding key中 * 代表一个单词
- fanout(multicast)
- 类似广播,转发到所有绑定交换机的queue
- headers (不怎么用)
- 请求头与消息头匹配,才能接受消息
Queue
消息队列、消息最终被送到这里等待consumer取走。
Binding
exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到exchange中的查询表中,用于message的分发依据。把exchange和queue按照路由规则绑定起来。
Routing key
一个路由规则,可用它来确定如何路由一个特定消息。
生产者在将消息发送给Exchange的时候,一般会指定一个routing key,来指定这个消息的路由规则,而这个routing key需要与Exchange Type及binding key联合使用才能最终生效。在Exchange Type与binding key固定的情况下(在正常使用时一般这些内容都是固定配置好的),我们的生产者就可以在发送消息给Exchange时,通过指定routing key来决定消息流向哪里。RabbitMQ为routing key设定的长度限制为255 bytes。
Message
消息,服务器和应用程序之间传送的数据,由Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body则就是消息体内容。