2012-04-14 84 views
8

基本上我的消费者也是生产者。我们得到一个初始数据集并将其发送到队列中。消费者需要一个项目,对其进行处理,从该点有3种可能性:是否可以确保唯一邮件位于rabbitmq队列中?

  1. 数据良好,并得到把“好”的队列存储
  2. 数据不好,丢弃
  3. 数据不好(尚)或差(尚),所以数据被分解成更小的部分并发送回队列进行进一步处理。

我的问题是与第3步,因为队列的增长速度非常快,在首个可能是一个数据被分解成队列复制的一部分,多数民众赞成者和消费者继续处理,并在结束了一个无限循环。

我认为防止这种做法是防止重复进入队列。我不能在客户端做到这一点,因为在一个小时之内,我可能会有很多核心处理数十亿个数据点(每个客户端在提交之前扫描它会使我减慢太多)。我认为这需要在服务器端完成,但正如我所提到的,数据量非常大,我不知道如何有效地确保没有重复。

我可能会问不可能的事情,但认为我会给它一个镜头。任何想法将不胜感激。

回答

2

的核心问题似乎是这样的:

"...its possible that a piece of data is broken down into a part that's 
duplicated in the queue and the consumers continue to process it and 
end up in a infinite loop." 

您可以专注于自己的排队项目所有你想要的独特性,但上面的问题是,你应该集中你的努力,IMO。防止无限循环的一种方法可能是在消费者重新排列已分解项目之前,由消费者设置消息有效载荷中的“已访问”位。

另一种选择是让消费者重新排队回到一个特殊的队列,该队列的处理方式稍有不同,以防止无限循环。无论哪种方式,您都应该通过将其作为应用程序策略的核心部分进行处理,而不是使用消息传递系统的功能来解决问题。

+0

我试图做到这些(我认为)。通过确保没有过去的项目重复,我确保相同的数据不会被处理多次。我只是在一定的的RabbitMQ的FPGA实现,有没有办法简单地发送消息的ID,并有RabbitMQ的丢弃重复或者我需要设置一个过滤器或东西(如果我这样做,它是如何与RabbitMQ的工作)。 – 2012-04-14 19:30:20

+0

没有办法做到这一点,AFAIK。兔子并不关心你的消息内容或者你的队列中已经存在的内容,所以应该由你的应用来处理。 – 2012-04-14 19:45:13

+0

所以,如果我的消息的ID是唯一的(我的实际数据的散列码),我需要发送给兔子之前,将它们存储在一个数据库或东西,查询针对(查看是否MSG ID已经被之前发送)?我一直在想,但它会要求客户端在我的消息服务器等待时执行一些查询(我正试图查看是否可以将此工作推送到消息服务器本身) – 2012-04-14 19:53:08

8

我想,即使你能解决不发送重复的队列中的问题,你迟早会触及这个问题:

从RabbitMQ的文档:“从失败中恢复:如果一由于客户端连接到的节点失败,客户端与代理断开连接,如果客户端是发布客户端,则代理可能已经接受并传递来自客户端的消息,而客户端未收到客户端的确认信息;同样在消费方面,客户可能已经发出了对消息的确认,并且不知道这些确认是否将其提供给经纪人并在失败之​​前处理发生。总之,你还需要确保你的消费客户端可以识别和处理重复的消息。”

基本上,它看起来像这样,你发送到RabbitMQ的请求,RabbitMQ的一个ACK回应,但1个原因或者你的消费者或制作者没有收到这个ACK,Rabbitmq没有办法知道没有收到这个确认,你的制片人最终会重新发送信息,从未收到过确认信。

这是在消息被作为一种RPC的应用程序尤其是处理重复的消息的痛苦,但它看起来像使用这种通讯架构的时候,这是不可避免的。

相关问题