工作队列(work queue)是在如下假定的情况发生的:一个任务派遣给一个消费者
在这里,我们将发送一个消息给多个consumers.-----即发布/订阅模式(publish/subscribe)
exchange(交换机)
RabitMQ中消息模型的核心思想是:生产者从来不直接发送消息到队列中。实际上,生产者甚至不知道消息会被发送到队列里。
相反,生产者只能向交换机(exchange)发送消息。交换机一方面接收生产者发送的消息,另一方面把接收到的消息推送到队列中。交换机必须明确的知道如何处理接收到的消息。应该附加到一个特定的队列吗?应该附加到很多队列吗?应该被丢弃吗?这些规则有exchenge类型指定。
exchange类型有如下几种:direct , topic , headers , fanout
声明一个exchange
err := ch.ExchangeDeclare(name string, type string, durable bool, auto-deleted bool, internal bool,no-wait bool, arguments Table)
最简单的exchange类型是fanout.把它接收到的所有消息广播到它已知的所有队列中。
列出服务器中所有exchanges:
sudo rabbitmqctl list_exchanges
临时队列(temporary queues)
给queue命名是很关键的。因为我们需要指明消费者到相同的queue.当你需要在生产者和消费者之间共享队列的时候给queue命名是相当重要的。
1.无论何时我们连接RabitMQ服务器的时候需要一个最新的,空的queue。为了达到这个目的,要么创建一个随机命名的queue要么让服务器随机选择一个queue 名字给我们。
2. 一旦我们断开RabitMQ消费者连接,该queue就应该被自动删掉。
绑定(bindings)
当创建了exchange和queue以后,需要告诉exchange发送message到我们的queue。exchange和queue的关系即为binding.
err = ch.QueueBind(
q.Name, // queue name
"", // routing key
"logs", // exchange
false,
nil
)
列出已经存在的binding:
rabbitmqctl list_bindings
如果没有queue与exchange绑定,消息会丢失,如果没有consumer监听我们能安全的丢弃该message.