我们正在用 Ruby 构建一个支持 AMQP 的消息传递系统。但是,我们在错误处理方面存在问题。
我们维护了一个异常白名单,这是安全的,并且 RabbitMQ 中的消息可以不被其他工作人员确认并重试。但是,对于未知或不可预见的错误,我们假设无论工人尝试多少次消息,总是会发生相同的失败。
这意味着,当出现未知错误时,我们需要捕获它,将其记录在某个地方(目前是 MySQL),然后向ACK
RabbitMQ 发送调用以从队列中删除消息。
目前一切都是使用 amqp gem 构建的,它是通过 EventMachine 事件发生的。由于 gem 的异步行为,这会导致问题,导致调用#ack
方法,并不意味着ACK
已发送到 RabbitMQ。
以前我通过粗略地将 raise 代码放入EM.next_tick
. 现在我们需要对每个 Ruby 工作线程进行多线程处理以提高性能,next_tick
但它不起作用。
简而言之:
在 amqp gem 中的异步 ACK 调用之后,您将如何以同步方式运行特定的代码?回调会很好,但没有可用的,至少没有一些严重邪恶的猴子补丁。