2012-08-02 37 views
0

我已经从队列中拾取消息的脚本,这并利用于其它处理所需的预处理工作同时创建消息。上不同的队列

现在,这些消息都被传递,所以我需要确认这些消息,如果监听消息服务的一个出现故障那么当它重新联机应该接受它错过了消息。

几个问题:

1 /是否有意义有被添加到每次预处理运行的每个处理后的服务队列? (所以我可能会在每个进程之后同时添加8个不同的队列 - 这将会产生大量的消息(数十万数据/天)。

2 /将消息添加到队列的速度有多快?添加到8-10队列将减慢我的软件?

3 /我可以使用话题交换来做到这一点fanout?我唯一担心的是,如果我的其中一个服务失败,他们会错过消息。

4 /从有经验的人有什么建议

回答

1

的一点想法:

如果你的后处理器每个都做一个不同的'工作',那么有一个队列供他们消费。如果你只有一大堆后处理器完成相同的任务,那么你只需要有一个队列,他们都可以从中使用消息。

添加消息队列快,加入到队列RabbitMQ的快,队列结合的交流是快。会降低系统性能的是消息的大小和你可能接收的数量,然后需要做多少处理。

的另一个考虑因素是与信息的持续性做,应该邮件生存的RabbitMQ重启,那就是如何关键他们是谁?如果它们不会丢失是非常重要的(这是你的问题的答案),那么你将需要确保它们被坚持。如果你看看RabbitMQ文档,你会发现这样做的成本很高。

这取决于你的系统实际上做... Topcis都不错,扇出都不错,但你的系统不依赖于它是适用的。

我会高度推荐阅读RabbitMQ在行动这是一个很好的资源,非常值得的钱。

+0

嗨@kzhen感谢您的答复,我的后处理器都做不同的工作,你是正确的。我的预处理脚本将在需要工作的数据库中记录ID到队列中,这是我需要的持久性和耐久性。我的问题更多的是从整洁的角度来看 - 必须同时向10个队列发布完全相同的消息似乎是一种耻辱。似乎不可能将多个队列绑定到一个通道,然后发布到所有队列获取消息的通道(似乎发布需要队列名称?) – williamvicary 2012-08-03 08:05:22

+0

@williamvicary与RabbitMQ一起发布到交换中。所以,随着你的整洁点,你将发布到交换中,交换将把你的消息转发到绑定它的队列中。至于你关于频道绑定的问题,这也不应该适用(也许你可以发布你的一些代码),因为你将绑定你的频道到交换机,就像$ channel-> exchange.declare('exchange-name' ,'交换型',...)然后使用$ channel-> basic_publish('message','routingKey') – kzhen 2012-08-03 08:33:34

+0

看看这里的PHP例子,看看“new_task.php”他们没有利用交换https://github.com/rabbitmq /rabbitmq-tutorials/blob/master/php/new_task.php所以你说如果我声明一个交换,然后在我没有队列发布的时候声明一些队列交换将发送消息到所有队列绑定在那届会议上呢? – williamvicary 2012-08-03 08:49:29