RabbitMQ介绍
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
AMQP协议
AMQ(高级消息队列协议)是一种消息传递协议,它使符合要求的客户端应用程序能够与符合要求的消息传递中间件代理进行通信。
消息代理从发布者(发布消息的应用程序,也称为生产者)接收消息,并将其路由到消费者(处理消息的应用)。由于它是一个网络协议,发布者、消费者和代理都可以驻留在不同的机器上。
Erlang语言
Erlang是一种通用的面向并发的编程语言,可以充分发挥CPU的性能,相对于其他MQ(Kafka、RocketMQ)延迟是最低的。
架构模型
Publisher 发布者
Publisher为发送消息的程序,发布消息时发布者可以指定各种消息属性(消息元数据)。在发布消息时通常会遇到一下问题:
- 网络不可靠时可能无法确定消息是否发送成功,AMQP具有重试、confirm、return机制保证消息发送成功。
- 在某些情况下,例如,当消息无法路由时,消息可能会返回给发布者、丢弃,或者如果代理实现了扩展,则将其放入所谓的“死信队列”。
Connection 连接器
AMQP是一种应用程序级协议,它使用TCP进行可靠传输。
Channel 通道
一些应用程序需要多个连接到代理上,然而,同时保持多个TCP连接打开是不可取的,因为这样做会消耗系统资源并使配置防火墙更加困难。AMQP连接可以被认为是“共享单个TCP连接的轻量级连接”的信道复用。通道只存在于连接的上下文中,而不单独存在,当一个连接关闭时,它上的所有通道都会关闭。对于使用多个线程/进程进行处理的应用程序,很常见的做法是为每个线程/进程打开一个新通道,而不在它们之间共享通道。
Virtual Host 虚拟主机
为了能够托管多个隔离的“环境”(用户组、交换机、队列等),AMQP包含虚拟主机(vhosts)的概念。它们类似于许多流行Web服务器使用的虚拟主机,并提供AMQP实体所在的完全隔离的环境。客户端指定在连接期间要使用的vhost。
Exchange 交换机
交换机接收消息并将其路由到零个或多个队列中。使用的路由算法取决于交换类型和绑定的规则。AMQP提供四种交换机类型:
Direct exchange:直接交换根据消息路由向队列传递消息。直接交换是消息单播路由的理想选择(尽管它们也可以用于多播路由)。
Fanout exchange:广播交换将消息路由到绑定到它的所有队列,并忽略路由密。如果N个队列绑定到广播交换机,则当向该交换机发布新消息时,该消息将传递给所有N个队列。
- Topic exchange:主题交换基于消息路由和用于将队列绑定到交换的模式之间的匹配,将消息路由到一个或多个队列。主题交换类型通常用于实现各种发布/订阅模式变体。
Binding 绑定
绑定是交换用来将消息路由到队列的规则。为了指示交换机E将消息路由到队列Q,Q必须绑定到E。
Consumer 消费者
在队列中存储消息是无用的,除非消费者可以使用它们。在AMQP模型中,消费者有两种方法可以做到这一点:
- 订阅并向他们发送消息。这是推荐选项
- 轮询(“拉API”):这种方式效率很低,在大多数情况下应该避免
同时消费者可以对消息做一下处理:
- 确认消息:AMQP为消费者提供了两种确认方式手动和自动。当消息被确认消费后代理应该从队列中删除消息。
- 拒绝消息:当消费者应用程序接收到消息时,该消息的处理可能会成功,也可能不会成功。消费者可以通过拒绝消息来向代理指示消息处理失败。当拒绝消息时,应用程序可以要求放弃或重新排队。
- 否认消息:与拒绝消息类似,不同的是拒绝消息无法拒绝多条消息,针对此情况AMQP提供否认消息方案。