1.RabbitMQ 是什么?
RabbitMQ是一个消息代理:它接受并转发消息。你可以把它想象成邮局:当你把要寄的邮件放进邮箱时,你可以确定邮递员最终会把邮件送到收件人那里。在这个比喻中,RabbitMQ是一个邮筒、一个邮局和一个邮递员。RabbitMQ和邮局之间的主要区别在于,它不处理纸张,而是接受、存储和转发二进制数据消息。
RabbitMQ和一般的消息传递使用了一些术语。
生产只不过意味着发送。发送消息的程序是生产者:P。
队列是RabbitMQ中邮箱的名称。虽然消息流经RabbitMQ和你的应用程序,但它们只能存储在队列中。队列只受主机的内存和磁盘限制,它本质上是一个大的消息缓冲区。许多生产者可以向一个队列发送消息,而许多消费者可以尝试从一个队列接收数据。队列的表示方式如下:
消费和接受有着相似的含义。consumer是一个主要等待接收消息的程序:C。
总结:
- 生产者是发送消息的用户应用程序。
- 队列是存储消息的缓冲区。
- 使用者是接收消息的用户应用程序。
注意,生产者、消费者和代理不必驻留在同一主机上;事实上,在大多数应用程序中,它们不需要。应用程序既可以是生产者,也可以是消费者。
2.工作队列
工作队列(又名:任务队列)背后的主要思想是避免立即执行资源密集型任务,并且必须等待它完成。相反,我们把任务安排在以后完成。我们将任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当您运行多个worker时,任务将在它们之间共享。这个概念在web应用程序中特别有用,因为在短的HTTP请求窗口中不可能处理复杂的任务。
3.发布订阅
为了说明这个模式,我们将构建一个简单的日志系统。它将由两个程序组成——第一个程序将发出日志消息,第二个程序将接收并打印它们。
在我们的日志系统中,接收程序的每个运行副本都会得到消息。这样我们就可以运行一个接收器并将日志引导到磁盘;与此同时,我们将能够运行另一个接收器并在屏幕上看到日志。 从本质上讲,发布的日志消息将被广播到所有的接收者。
RabbitMQ消息模型的核心思想是生产者永远不会直接向队列发送任何消息。实际上,通常生产者甚至不知道消息是否将被传递到任何队列。 相反,生产者只能向交换器发送消息。交换是一件非常简单的事情。它一边接收来自生产者的消息,另一边将它们推送到队列中。交换器必须确切地知道如何处理它收到的消息。是否应该将它附加到特定的队列中?是否应该将它附加到许多队列中?或者它应该被丢弃。该规则由交换类型定义。
有几种可用的交换类型:direct、topic、headers和fanout。我们来关注最后一个,扇形。让我们创建一个这种类型的exchange,并将其命名为logs:
channel.exchangeDeclare("logs", "fanout");
扇出交换非常简单。顾名思义,它只是将接收到的所有消息广播给它所知道的所有队列。
4.路由
在本教程中,我们将为其添加一个特性—我们将使仅订阅消息的子集成为可能。例如,我们将能够只将关键错误消息定向到日志文件(以节省磁盘空间),同时仍然能够在控制台上打印所有日志消息。
5.主题Topics
虽然使用直接交换改进了我们的系统,但它仍然有局限性——它不能基于多个标准进行路由。在我们的日志系统中,我们可能不仅希望订阅基于严重性的日志,还希望订阅基于发出日志的源的日志。您可能从syslog unix工具中了解到这个概念,它根据严重性(info/warn/crit…)和设施(auth/cron/kern…)路由日志。这将给我们很大的灵活性——我们可能只想听来自'cron'的严重错误,但也想听来自'kern'的所有日志。在我们的日志系统中实现
在之前的教程中,我们改进了日志系统。我们没有使用只能进行虚拟广播的fanout交换,而是使用了直接交换,从而获得了选择性接收日志的可能性。虽然使用直接交换改进了我们的系统,但它仍然有局限性——它不能基于多个标准进行路由。在我们的日志系统中,我们可能不仅希望订阅基于严重性的日志,还希望订阅基于发出日志的源的日志。您可能从syslog unix工具中了解到这个概念,它根据严重程度(info/warn/crit…)路由日志。
6.RPC
我们学习了如何使用工作队列在多个工作者之间分配耗时的任务。但是,如果我们需要在远程计算机上运行一个函数并等待结果呢?那是另一回事了。这种模式通常称为远程过程调用或RPC。
我们将使用RabbitMQ构建一个RPC系统:一个客户端和一个可扩展的RPC服务器。由于我们没有任何值得分发的耗时任务,因此我们将创建一个返回斐波那契数的虚拟RPC服务。
我们的RPC将这样工作:
- 对于RPC请求,客户端发送具有两个属性的消息:replyTo,它被设置为仅为请求创建的匿名独占队列,以及correlationId,它被设置为每个请求的唯一值。
- 请求被发送到rpc_queue队列。
- RPC工作器(又名:服务器)正在该队列上等待请求。当出现请求时,它完成任务,并使用replyTo字段中的队列将带有结果的消息发送回客户机。
- 客户端等待应答队列上的数据。当出现消息时,它会检查correlationId
RabbitMQ 是部署最广泛的开源消息代理.,RabbitMQ 拥有数以万计的用户,是最受欢迎的开源消息代理之一。从T-Mobile 到Runtastic,RabbitMQ 在全球范围内用于小型初创公司和大型企业.。RabbitMQ 是轻量级的,易于在本地和云端部署。它支持多种消息传递协议。RabbitMQ 可以部署在分布式和联合配置中,以满足大规模、高可用性的要求.