RabbitMQ中的即时标志

时间:2016-05-31 12:58:34

标签: rabbitmq

我有一个使用API​​的客户端。 API将信息发送到rabbitmq。 Rabbitmq给工人。

如果出现问题,我应该回复客户 - 邮件没有被路由到某个队列,并且此时没有获得执行(完全确认) 在5-10秒后启动的任务没有意义。

恰当地说,我必须使用强制性和立即标志。 我不能增加工人的数量,我不能在另一台服务器上运行工人。这是一种需求。

所以,因为我发现自从rabbitmq v.3.0x以来,直接的旗帜一直没有得到支持 rabbitmq的开发人员建议使用TTL = 0作为队列,但之后我将无法检查消息的状态。

是否有机会改变这种行为?请分享您的经验,如何解决这样的问题。

谢谢。

2 个答案:

答案 0 :(得分:0)

我不确定,但在用俄语阅读原始问题后,可能是使用发布者和消费者确认可能是您想要的。请参阅本答复中的最后三段。

由于您希望从工作人员那里获取已发布消息的消息结果,因此看起来RPC模式就是您想要的。见RabbitMQ RPC tuttorial。选择一个你最熟悉的编程语言部分,整体概念是一样的。您可能还会发现Direct reply-to有用。

它与immediate标记功能不同,但如果您的所有发布商都使用immediate方案运行,则可能是AMQP协议不是这种类型的最佳选择任务。立即意味着"立即发送此消息或在地狱中燃烧"当你发布的数量超过可以处理的数量时,可能会出现这种情况。在这种情况下,RPC +响应超时可能是应用程序端的一个很好的选择(例如套接字超时)。但是,当仍然处理消息时,它对非幂等RPC调用不起作用,因此您可能希望使用per-queue or per-message TTL(或设置queue length limit)。如果消息为dead-lettered,您可以在那里(如果您出于某种原因需要它)。

<强> TL; DR

关于&#34;某事&#34;可能会出错,它可以在不同的层面上进行,我们简单地定义为:

    在RabbitMQ之前
  • ,如发送应用程序故障和网络问题;
  • 在RabbitMQ中,比如说,错过了目标队列,消息超时,队列长度限制,一些困难和意外的内部错误;
  • 在RabbitMQ之后,在大多数情况下 - 消息处理应用程序错误或某些第三方服务,如数据持久性或缓存层中断。

网络中断或硬件错误等一些错误有点史诗,并不是这个q / a的主题。

保证邮件传递的典型方案是使用publisher confirms或事务(速度较慢)。在你得到确认后,这意味着RabbitMQ得到你的消息,如果它有路由 - 放在队列中。如果不是,则删除它,或者如果mandatory方法返回basic.return标志。

对于消费者来说,它类似于basic.consumer / basic.get之后的客户端确认消息,它认为已收到并从队列中删除。

因此,当您在两端使用确认时,您可以免受邮件丢失的影响(我们不会遇到RabbitMQ本身可能存在某些错误的情况)。

答案 1 :(得分:0)

波格丹,谢谢你的回复。 似乎,我表达了我的想法。

Scheme可能看起来像这样。系统的每个组件都必须做它必须做的事情:) 一个想法是使每个组件更简单。

enter image description here

如何执行任务。 客户端使用请求转到HTTP-API,并且必须获得如下响应:

  • 肯定 - 它已经排队
  • 否定 - 有错误的回应和原因

当我谈论确认时,我的意思是我必须知道消息已经发送(没有免费工作人员 - rabbitmq可以删除消息),必须通知客户端。 发送的消息无法传递到某个队列,必须通知客户端。

如何处理邮件。

  • 发送消息以进行执行。
  • 将演出的状态写入HeartBeat

状态。

  • 客户端自己从HeartBeat获取状态,然后决定 它必须这样做。

我不确定,RPC对我们有用,即RPC意味着客户端必须等待来自服务器的响应。任务可能会工作很长时间。客户端和服务器之间的限制过多,客户端的附加逻辑。

有限的队列大小也许没用。 队列大小可能大于工人数的可能情况。 (配置或定义设置中的问题)。 然后5-10秒的想法没有意义。

由于以下原因,TTL无效:

  

将TTL设置为0会导致消息在到达时过期   排队,除非他们可以立即交付给消费者。从而   这提供了basic.publish的立即标志的替代方案   RabbitMQ服务器不支持。与那面旗帜不同,没有   发布basic.returns,如果设置了死信交换   消息将是死信。

直接回复:

  

然后,RPC服务器将看到带有生成的回复属性   名称。它应该使用路由发布到默认交换(“”)   密钥设置为此值(即就像它发送回复一样   像往常一样排队)。然后,该消息将直接发送给客户端   消费者。

然后我将无法路由消息。

所以,对不起。我可能会喋喋不休,即我是AMQP和rabbitmq的新手。