上一篇博客中,我们实现了工作队列,并且我们的工作队列中的一个任务只会发给一个工作者,除非某个工作者未完成任务意外被杀死,会转发给另外的工作者.在这部分中,我们会做一些完全不同的事情 - 我们会向多个消费者传递信息.这种模式被称为"发布/订阅". 为了说明这个模式,我们要建立一个简单的日志记录系统.它将包括两个程序 - 第一个将发出日志消息,第二个将接收并打印它们. 在我们的日志系统中,每一个运行的接收者程序都会收到日志.这样我们就可以实现一个接收者将接收到的数据写到硬盘上,与此同时,另…
本文翻译自RabbitMQ官网的Go语言客户端系列教程,本文首发于我的个人博客:liwenzhou.com,教程共分为六篇,本文是第三篇--发布/订阅. 这些教程涵盖了使用RabbitMQ创建消息传递应用程序的基础知识. 你需要安装RabbitMQ服务器才能完成这些教程,请参阅安装指南或使用Docker镜像. 这些教程的代码是开源的,官方网站也是如此. 先决条件 本教程假设RabbitMQ已安装并运行在本机上的标准端口(5672).如果你使用不同的主机.端口或凭据,则需要调整连接设置. 发布/订…
发布订阅模式 什么时发布订阅模式 把消息发送给多个订阅者.也就是有多个消费端都完整的接收生产者的消息 换句话说 把消息广播给多个消费者 消息模型的核心 RabbitMQ不发送消息给队列,生产者也不知道消息发送到队列 生产者只发送消息到exchange 交换器, exchange一方面从生产者接收消息,另一方面把消息推送到队列中. exchange必须知道如何处理接收到的消息 .是加到特定队列中,还是添加到多个队列中,还是放弃.这个是由他的类型来决定 . 而消息的类型有四种,分别是 Direct,…
rabbitmq的目的并不是让生产者把消息直接发到队列里面去, 这样不能实现解耦的目的,也不利于程序的扩展. 所以就有交换机(exchanges)的概念. 交换机有几种类型:direct, topic, headers 和fanout, 可以为交换机命名,还有一种没有命名的交换机,上几章的消息都是发布到没有命名的交换机. channel.ExchangeDeclare(exchange: "logs", type: "fanout");var message = G…
在第二个教程中,我们学习了如何使用Work Queues在多个工作者之间分配耗时的任务. 但是如果我们需要在远程计算机上运行功能并等待结果怎么办? 那是一个不同的模式. 此模式通常称为远程过程调用或RPC. 在本教程中,我们将使用RabbitMQ构建一个RPC系统:一个客户端和一个可扩展的RPC服务器.由于我们没有任何值得分发的耗时任务,我们将创建一个返回斐波纳契数字的虚拟RPC服务. 客户端 为了说明如何使用RPC服务,我们将创建一个简单的客户端类. 它将公开一个名为call的方法,该方法发送…
在上一个教程中,我们改进了我们的日志记录系统.我们使用direct类型转发器,使得接收者有能力进行选择性的接收日志,,而非fanout那样,只能够无脑的转发 虽然使用direct类型改进了我们的系统,但它仍然存在一些局限性 - 它不能够基于多重条件进行路由选择. 在我们的日志记录系统中,我们可能不仅要根据严重性订阅日志,还可以基于发出日志的源进行订阅.您可能会从unix工具syslog 中了解此概念,该工具根据严重性(info / warn / crit ...)和设备(auth / cron…
在上一个教程中,我们构建了一个简单的日志记录系统. 我们能够广播日志消息给所有你的接收者. 在本教程中,我们将为其添加一个功能 - 我们将让日志接收者可以仅订阅一部分消息. 例如,我们将能够仅将关键的错误消息写入到日志文件(以节省磁盘空间),同时仍然能够在控制台上打印所有日志消息. 绑定(Bindings) 在以前的例子中,我们已经使用过绑定.类似下面的代码: channel.QueueBind(queue: queueName, exchange: "logs", routingKe…
这篇中我们将会创建一个工作队列用来在工作者(consumer)间分发耗时任务. 工作队列的主要任务是:避免立刻执行资源密集型任务和避免必须等待其完成.相反地,我们进行任务调度:我们把任务封装为消息发送给队列.工作进行在后台运行并不断的从队列中取出任务然后执行.当你运行了多个工作进程时,任务队列中的任务将会被这些工作进程共享执行. 这样的概念在web应用中极其有用,当在很短的HTTP请求间需要执行复杂的任务. 准备 在本教程的前面部分,我们发送了一个包含Hello World!的消息. 现在我们将…
本教程假定RabbitMQ已在标准端口(5672)上的localhost上安装并运行.如果使用不同的主机,端口或凭据,连接设置将需要调整. RabbitMQ是一个消息代理:它接受并转发消息. 您可以将其视为邮局:当您将要发布的邮件放在邮箱中时,您可以确信Postman先生最终会将邮件发送给收件人. 在这个比喻中,RabbitMQ是一个邮箱,邮局和邮递员. RabbitMQ和邮局之间的主要区别在于它不处理纸张,而是接受,存储和转发二进制数据块的消息. RabbitMQ和消息传递一般使用一些术语.…
为了说明这种模式,我们将建立一个简单的日志系统.这个系统将由两个程序组成,第一个将发出日志消息,第二个将接收并处理日志消息.在我们的日志系统中,每一个运行的接收程序的副本都会收到日志消息. 交换器(Exchanges) 在本教程的前面部分,我们主要介绍了发送者和接收者,发送者发送消息给 RabbitMQ 队列,接收者从 RabbitMQ 队列获取消息.在这一篇教程,我们会引入交换器,展示 RabbitMQ 的完整的消息模型. 让我们快速了解在前面的教程中介绍的内容: 生产者是发送消息的用户应用程…