之前的教程中,我们创建了一个工作队列。在一个工作队列背后的假设是将每个任务都准确地交付给一个工作人员。在这个环节我们要做些完全不同的事情—我们将要把一个消息传递给多个消费者。这种模式被称为“发布/订阅”。
为了阐述这种模式,我们打算构建一个简单的日志系统。它由两个程序组成—第一个发出日志消息,第二个接收消息并打印出来。
在我们的日志系统中,每次运行接收者程序的副本都将收到消息。这使我们能够运行一个接收者程序,将日志导向磁盘;同时我们可以运行另一个接收者程序查看屏幕上的日志。
实际上,已发布的日志消息将被广播到所有接收者。
交换
在教程的前面部分中,我们发送和接受消息都来自一个队列,现在是时候引进一个完整的Rabbit消息模型了。
让我们快速地回顾一下在之前的教程里介绍的内容:
生产者是发送消息的用户程序。
队列是储存消息的缓存。
消费者是接收消息的用户程序。
在Rabbit消息模型中核心的思想是,生产者从不直接向一个队列发送任何消息。事实上,通常生产者甚至不知道将一个消息是否传递到了某一队列。
相反的,生产者只能向交换器(exchange)发送消息。交换器是一个非常简单的东西。它在一端从生产者接收消息,在另一端将消息发布到队列。交换器必须准确地知道它收到的消息要做什么。它应该被添加到一个特殊的队列?它应该被添加到多个队列?或者它应该被废弃?这些规则由交换类型定义。
有许多交换类型是可用的:direct,tpic,headers和fanout。我们来关注最后一种–fanout,我们来创建一个这种类型的交换器命名为logs:
channel.exchangeDeclare("logs", "fanout");
这个fanout交换器非常简单。就像你可以从它的名字中猜到的,它仅仅是将它收到的所有消息传递到它所知的队列中去。这正是我们的日志系统所需要的。
列出交换器
你可以用有用的rabbitmqctl列出交换器:
sudo rabbitmqctl list_exchanges
在列表里会有一些