RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
AMQ(高级消息队列协议)是一种消息传递协议,它使符合要求的客户端应用程序能够与符合要求的消息传递中间件代理进行通信。
消息代理从发布者(发布消息的应用程序,也称为生产者)接收消息,并将其路由到消费者(处理消息的应用)。由于它是一个网络协议,发布者、消费者和代理都可以驻留在不同的机器上。
Erlang是一种通用的面向并发的编程语言,可以充分发挥CPU的性能,相对于其他MQ(Kafka、RocketMQ)延迟是最低的。
Publisher为发送消息的程序,发布消息时发布者可以指定各种消息属性(消息元数据)。在发布消息时通常会遇到一下问题:
AMQP是一种应用程序级协议,它使用TCP进行可靠传输。
一些应用程序需要多个连接到代理上,然而,同时保持多个TCP连接打开是不可取的,因为这样做会消耗系统资源并使配置防火墙更加困难。AMQP连接可以被认为是“共享单个TCP连接的轻量级连接”的信道复用。通道只存在于连接的上下文中,而不单独存在,当一个连接关闭时,它上的所有通道都会关闭。对于使用多个线程/进程进行处理的应用程序,很常见的做法是为每个线程/进程打开一个新通道,而不在它们之间共享通道。
为了能够托管多个隔离的“环境”(用户组、交换机、队列等),AMQP包含虚拟主机(vhosts)的概念。它们类似于许多流行Web服务器使用的虚拟主机,并提供AMQP实体所在的完全隔离的环境。客户端指定在连接期间要使用的vhost。
交换机接收消息并将其路由到零个或多个队列中。使用的路由算法取决于交换类型和绑定的规则。AMQP提供四种交换机类型:
绑定是交换用来将消息路由到队列的规则。为了指示交换机E将消息路由到队列Q,Q必须绑定到E。
在队列中存储消息是无用的,除非消费者可以使用它们。在AMQP模型中,消费者有两种方法可以做到这一点:
同时消费者可以对消息做一下处理:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。