是否适合立即关闭引发错误的RabbitMQ客户端进程?

时间:2017-03-24 17:56:27

标签: java rabbitmq

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

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

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

除了读取/写入方法引发的IOExceptionTimeoutExceptionInterruptedException之外,客户端代码还可以通过异常处理程序处理一些异常条件(可以设置为ConnectionFactory.setExceptionHandler())。

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

1 个答案:

答案 0 :(得分:1)

很难确定你在这里列出的内容,但我鼓励你至少尝试区分永久性,瞬态和未知错误。在第一种情况下,您需要立即使用您的监控系统,因为可能需要某种人为干预。对于第二个,你可能会在短暂的延迟后再试一次。最后,关闭客户端流程可能是最好的方法。

在关闭客户端之前要考虑一些事情:

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

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