RabbitMQ Publish && Subscribe - zLulus/My_Note GitHub Wiki

简介

同时向多个消费者发送消息。 此模式称为“发布/订阅”

为了说明这种模式,我们将构建一个简单的日志记录系统
它将包含两个程序 - 第一个将发出日志消息,第二个将接收和打印它们
在我们的日志记录系统中,接收程序的每个运行副本都将获取消息。 这样我们就可以运行一个接收器并将日志定向到磁盘; 同时我们将能够运行另一个接收器并在屏幕上看到日志
基本上,发布的日志消息将被广播给所有接收者

回顾 && 交换类型

生产者是发送消息的用户应用程序   
队列是存储消息的缓冲区   
使用者是接收消息的用户应用程序  

RabbitMQ中消息传递模型的核心思想是生产者永远不会将任何消息直接发送到队列
实际上,生产者通常甚至不知道消息是否会被传递到任何队列
相反,生产者只能向交易所发送消息。交换是一件非常简单的事情
一方面,它接收来自生产者的消息,另一方面将它们推送到队列
交易所必须确切知道如何处理它收到的消息:它应该附加到特定队列吗?它应该附加到许多队列吗?或者它应该被丢弃。其规则由交换类型定义

有几种交换类型(exchange types)可供选择:directtopicheadersfanout
我们将专注于最后一个 - fanout。让我们创建一个这种类型的交换,并将其称为日志:

channel.ExchangeDeclare(“logs”,“fanout”);

fanout交换非常简单。正如您可能从名称中猜到的那样,它只是将收到的所有消息广播到它知道的所有队列中。而这正是我们记录器所需要的

Bindings

需要告诉交换机将消息发送到我们的队列
交换(exchange)和队列(queue)之间的关系称为绑定(binding)
1
我们需要在发送时提供routingKey,但是对于fanout交换,它的值会被忽略

效果

20190606_203118

示例代码

EmitLog
ReceiveLogs