RabbitMQ 是一个消息代理。说白了,它从“生产者”接收消息,并将这些消息发送给“消费者”。在这个过程中,它可以根据你给定的规则对消息进行路由、缓冲和持久化。
1. 从指定的队列中发送和接收消息
2. 我们要创建一个任务队列,用它来把耗时的任务分发到多个“worker”手里。
工作队列(也叫任务队列)的主要是思想是避免立即处理那种资源密集且需要处理很久才能完成的任务。相反呢,我们安排这种任务稍后完成。我们把任务封装成消息的形式发送到一个队列。一个后台运行的“worker”进程会取出这些任务,最终完成这个任务。当你运行多个“worker”时,任务便会共享于他们之间。
a. 工总的worker 死掉, 要保证消息不会丢失, 解决方案, worker工作完后发送确认消息
b. rabbitmq server挂掉, 保证消息不会丢失, 解决方案, 将工作队列和消息声明为持久
c. 公平分配, 设置basic_qus
3. 发布/订阅
上一节,我们建立一个工作队列。其隐含的假设是一个任务只派送给一个worker。这回我们会做一些完全不同的——派送信息到多个消费者,这种模式叫做“发布/订阅”。
生产者是一个发送消息的用户程序
队列是用来存储消息的缓冲区
消费者是一个接收消息的用户程序
交换器是个非常简单的东西。一方面它从生产者接收消息,另一方面它将消息推送到队列。交换器必须清楚地知道如何处理收到的消息。是应该把这个消息追加到一个特定的队列?还是追加到多个队列?亦或者应将其丢弃。 要做到这个,我们可以通过交换器类型(exchange type)来定义规则
交换器类型:direct,topic,headers和fanout
fanout:把所有收到的消息广播给所有已知队列。这恰好是我们日志系统想要的。
默认的或无名氏交换器:如果有routing_key,消息就会被路由到routing_key指定的队列
捆绑:告诉交换器向那个队列发送消息 $channel->queue_bind($queue_name, 'logs');
4. Direct exchange(定向交换器)
定向交换器背后的算法很简单——消息会推送到:消息routing key和队列binding key完全匹配的的队列中。
将特定的消息发送到特定的队列
Multiple bindings(多重捆绑) 相同的binding key捆绑多个队列, 行为类似于fanout
5. Topic exchange
我们可能想不仅订阅基于严重等级的内容,而且订阅基于消息发布来源的内容.
我们可能想只是收听来自cron的致命错误和来自kern的所有消息。
发送到topic交换器的消息不能给一个任意的routing_key——它必须是一个由逗号分隔的单词列表。
Topic exchange
Topic 交换器很强大,它可以模拟其他交换器的行为
当一个队列捆绑一个#的binding key——它会像fanout交换器一样,忽略掉routing key,接收所有的消息.
在捆绑中如果没有使用特殊字符星号和井号,topic交换器的行为就跟定向交换器一样。
6. Remote procedure call (RPC)
用RabbitMQ打造一个RPC系统:一个客户端和一个可扩展的RPC服务端
附:RabbitMQ命令
sudo rabbitmqctl list_queues name messages_ready messages_unacknowledged //查看未处理消息
sudo rabbitmqctl list_exchanges //列出交换器类型
sudo rabbitmqctl list_bindings //队列和交换器之间的捆绑关系
Rabbit总结
猜你喜欢
转载自37235798.iteye.com/blog/2287067
今日推荐
周排行