概述
主流的消息中间件主要有:
ActiveMQ
、Kafka
、RabbitMQ
、RocketMQ
等等......,而我们今天的主角是:RabbitMQ
,RabbitMQ
基于AMQP
协议来实现的,AMQP
的和主要特征是面向消息、队列、路由(包括点对点和发布 / 订阅)、可靠性、安全,RabbitMQ
支持多种语言,有消息确认机制和持久化机制,保证数据不丢失的前提做到可靠性、可用性。另外,如今同类型组件市场上,RabbitMQ
也占有率还是比较高,也是很多中小厂比较青睐的一款消息中间件产物,无非得益于它性能好、容易上手等优点。
最近有想写做一个消息队列专栏,总结记录自己在使用消息队列实战经验顺便做一些分享,本篇文章主要讲述RabbitMQ的底层实现原理,对于新手来说能起到很好的了解作用,对于使用过MQ的开发者,也能起到一定的帮助,在介绍RabbitMQ
之前,有必要先了解一下什么是AMQP
协议。
什么是AMQP协议?
AMQP
的全称:Advanced Message Queuing Protocol(高级消息队列协议),它是消息队列的一个规范,其中定义个很多核心的概念,AMQP
与JMS(Java Message Service)
Java平台的专业技术规范类似,同样提供了很多面向中间件的API
,用于两个应用程序之间,或者分布式系统之间的发送消息,进行异步通信。
AMQP核心概念
AMQP组件 | 说明 |
---|---|
Server | 又称Broker ,接受客户端的连接,实现AMQP 实体服务 |
Connection | 连接,应用于程序与Broker 的网络连接 |
Channel | 网络通道,几乎所有的操作都是在channel 中进行的,channel 是进行消息读写的通道,客户可以建立多个channel ,每个channel 代表一个会话任务 |
Message | 消息,服务器与应用程序之间传送的数据,有Properties 和Body 组成,Properties 可以对消息进行修饰,比如消息的优先级,延迟等高级特性,Body 是消息体内容 |
Virtual host | 虚拟地址,用于进行逻辑隔离,最上层的消息路由,一个Virtrual host 里面可以有若干个Exchange 和Queue ,用一个Virtrual host 里面不能有相同名字的Exchange 或Queue |
Exchange | 交换机,接收消息,根据路由键转发消息到绑定的队列 |
Routingkey | 生产者架构消息发给交换器的时候,会指定一个RoutingKey ,用来指定这个消息的路由规则,通过RoutingKey 来决定消息流向哪里 |
Binding | 绑定,RabbitMQ 中通过绑定将交换器跟队列关联起来,在绑定的时候会指定一个BindingKey ,这样RabbitMQ 就知道如何正确的将消息路由到对应的队列中去了,也就是生产者将信息发送给交换器时,需要一个RoutingKey ,当RoutingKey 与BindingKey 完全匹配时,消息会被路由到对应的队列中去 |
Queue | 全名Message Queue ,消息队列,保存消息并将他们转发给消费者 |
工作模型
- 生产者只需要将消息投递到
Exchange
交换机中,不需要关注消息被投递到哪个队列。 - 消费者只需要监听队列来消费消息,不需要关注消息来自于哪个
Exchange
。