【问题标题】:Is it appropriate to immediately shut down a RabbitMQ client process which throws an error? [closed]立即关闭引发错误的 RabbitMQ 客户端进程是否合适? [关闭]
【发布时间】:2017-03-24 17:56:27
【问题描述】:

我有一个 Java 程序,它使用 RabbitMQ Java 客户端库读取和写入 RabbitMQ 队列。

我正在考虑对进程应用立即关闭策略,即,一旦库抛出异常,进程就会自动停止。

从交付可靠性的角度来看,这会导致任何问题吗?

除了读/写方法抛出的IOExceptionTimeoutExceptionInterruptedException之外,客户端代码还可以通过异常处理程序处理一些异常情况(可以使用ConnectionFactory.setExceptionHandler()设置)。

对于这种情况,请考虑持久(非瞬态)消息,并且必须确认每条已发布的消息。

【问题讨论】:

  • 我不明白为什么人们会因为基于意见而投票决定关闭。根据我的理解,这是非常客观的,使用 Java 客户端这种方法可能会导致问题,也可能不会。

标签: java rabbitmq


【解决方案1】:

很难从您在此处列出的内容中确定,但我鼓励您至少尝试区分永久性、暂时性和未知错误。在第一种情况下,您需要立即使用您的监控系统,因为可能需要某种人工干预。对于第二个,您可能会在短暂延迟后重试。最后,关闭客户端进程可能是最好的办法。

不过,在关闭客户端之前需要考虑的一些事项:

  • 是否有任何未完成的入站请求需要接收某种“错误”响应?
  • 是否存在需要保留的状态?
  • 真的没有更好的方法来恢复这种情况(例如,转储 Rabbit 连接并建立另一个连接)吗?
  • 有多少其他机器正在打开 Rabbit 连接?如果它们都尝试同时启动(例如,它们是否都在访问数据库、网络资源等)会发生什么?

出于数据完整性问题,您还需要考虑如何配置队列。如果队列本身被命名为持久队列,那么重新启动 clint 仅意味着某些消息可能会累积一段时间,您将能够再次将它们取回。如果没有,则在断开连接时队列将被删除,并且所有未传递的消息(或在重新连接之前发布的新消息)都将丢失。

【讨论】:

  • 感谢您的意见。我忘了提到持久队列。目前没有关于这些考虑的问题,因此关闭该过程是可以的。我想知道 Java 客户端是否可以保留一些内部状态,如果 JVM 突然停止,这可能会导致问题。
  • 知道了。我没有专门使用 Java 客户端,所以我无法评论那部分内容。我用过的 Django 和 iOS 客户端都没有这样的问题,FWIW...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
相关资源
最近更新 更多