Ruby EventMachine AMQP:确保在引发异常之前发生特定的异步调用

我们正在
Ruby中构建一个支持AMQP的消息传递系统.但是我们遇到了错误处理的问题.

我们维护一个安全的异常白名单,RabbitMQ中的消息可以不被其他工作人员承认和重试.但是,在未知或无法预料的错误中,我们假设无论工作者尝试多少次消息,都会发生同样的失败.

这意味着,当引发未知错误时,我们需要捕获它,将其记录到某处(当前是MySQL),然后向RabbitMQ发送ACK调用以从队列中删除该消息.

目前所有东西都是使用amqp gem构建的,它与EventMachine一起使用.这会导致问题,因为调用#ack方法,并不意味着由于gem的异步行为已经将ACK发送到RabbitMQ.

之前我通过粗略地将加注代码放在EM.next_tick中解决了这个问题.现在我们需要为每个Ruby工作程序多线程以提高性能,而next_tick不起作用.

简而言之:

在amqp gem中异步ACK调用之后,您将如何以同步方式运行特定代码?回调会很好,但没有可用的,至少没有一些严重邪恶的猴子补丁.

最佳答案 我很乐意为你解决这个问题
https://github.com/ruby-amqp/amqp/issues/issue/9目前,gem并不像一个表现良好的异步库,而且很多地方都缺少回调.我正在努力解决这个问题.我希望,我会尝试将它修复到我即将发布的0.7.

点赞