我有一个使用API的客户端。 API将信息发送到rabbitmq。 Rabbitmq给工人。
如果出现问题,我应该回复客户 - 邮件没有被路由到某个队列,并且此时没有获得执行(完全确认) 在5-10秒后启动的任务没有意义。
恰当地说,我必须使用强制性和立即标志。 我不能增加工人的数量,我不能在另一台服务器上运行工人。这是一种需求。
所以,因为我发现自从rabbitmq v.3.0x以来,直接的旗帜一直没有得到支持 rabbitmq的开发人员建议使用TTL = 0作为队列,但之后我将无法检查消息的状态。
是否有机会改变这种行为?请分享您的经验,如何解决这样的问题。
谢谢。
答案 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;可能会出错,它可以在不同的层面上进行,我们简单地定义为:
网络中断或硬件错误等一些错误有点史诗,并不是这个q / a的主题。
保证邮件传递的典型方案是使用publisher confirms或事务(速度较慢)。在你得到确认后,这意味着RabbitMQ得到你的消息,如果它有路由 - 放在队列中。如果不是,则删除它,或者如果mandatory
方法返回basic.return
标志。
对于消费者来说,它类似于basic.consumer
/ basic.get
之后的客户端确认消息,它认为已收到并从队列中删除。
因此,当您在两端使用确认时,您可以免受邮件丢失的影响(我们不会遇到RabbitMQ本身可能存在某些错误的情况)。
答案 1 :(得分:0)
Scheme可能看起来像这样。系统的每个组件都必须做它必须做的事情:) 一个想法是使每个组件更简单。
如何执行任务。 客户端使用请求转到HTTP-API,并且必须获得如下响应:
当我谈论确认时,我的意思是我必须知道消息已经发送(没有免费工作人员 - rabbitmq可以删除消息),必须通知客户端。 发送的消息无法传递到某个队列,必须通知客户端。
如何处理邮件。
状态。强>
我不确定,RPC对我们有用,即RPC意味着客户端必须等待来自服务器的响应。任务可能会工作很长时间。客户端和服务器之间的限制过多,客户端的附加逻辑。
有限的队列大小也许没用。 队列大小可能大于工人数的可能情况。 (配置或定义设置中的问题)。 然后5-10秒的想法没有意义。
由于以下原因,TTL无效:
将TTL设置为0会导致消息在到达时过期 排队,除非他们可以立即交付给消费者。从而 这提供了basic.publish的立即标志的替代方案 RabbitMQ服务器不支持。与那面旗帜不同,没有 发布basic.returns,如果设置了死信交换 消息将是死信。
直接回复:
然后,RPC服务器将看到带有生成的回复属性 名称。它应该使用路由发布到默认交换(“”) 密钥设置为此值(即就像它发送回复一样 像往常一样排队)。然后,该消息将直接发送给客户端 消费者。
然后我将无法路由消息。
所以,对不起。我可能会喋喋不休,即我是AMQP和rabbitmq的新手。