4

我们正在用 Ruby 构建一个支持 AMQP 的消息传递系统。但是,我们在错误处理方面存在问题。

我们维护了一个异常白名单,这是安全的,并且 RabbitMQ 中的消息可以不被其他工作人员确认并重试。但是,对于未知或不可预见的错误,我们假设无论工人尝试多少次消息,总是会发生相同的失败。

这意味着,当出现未知错误时,我们需要捕获它,将其记录在某个地方(目前是 MySQL),然后向ACKRabbitMQ 发送调用以从队列中删除消息。

目前一切都是使用 amqp gem 构建的,它是通过 EventMachine 事件发生的。由于 gem 的异步行为,这会导致问题,导致调用#ack方法,并不意味着ACK已发送到 RabbitMQ。

以前我通过粗略地将 raise 代码放入EM.next_tick. 现在我们需要对每个 Ruby 工作线程进行多线程处理以提高性能,next_tick但它不起作用。

简而言之:

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

4

1 回答 1

2

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

于 2011-01-17T12:46:20.973 回答