我正在开发一个定期需要执行大量 IO 绑定操作的 Rails 应用程序。这些操作可以异步执行。例如,对于每个用户,系统每天需要查询 Salesforce.com 以获取用户当前正在跟踪的帐户(公司)列表。这会导致大量(可能 > 100k)的小查询。
我们当前的方法是将 ActiveMQ 与 ActiveMessaging 结合使用。我们的每个用户都作为不同的消息被推送到队列中。然后,消费者将用户从队列中拉出,查询 Salesforce.com 并处理结果。但是这种方法给了我们可怕的性能。在单个轮询进程中,我们一次只能处理一个用户。因此,Salesforce.com 查询变为序列化。除非我们实际上运行数百个轮询器进程,否则我们无法接近饱和运行轮询器的服务器。
我们正在寻找 EventMachine 作为替代方案。它的优势是允许我们在单个 EventMachine 进程中同时启动大量 Salesforce.com 查询。因此,我们的服务器得到了很好的并行性和利用率。
但是 EventMachine 有两个问题。1) 我们失去了使用 ActiveMQ/ActiveMessaging 提供的可靠消息传递。2) 我们不能轻易地定期重启我们的 EventMachine 来减少内存增长的影响。例如,使用 ActiveMessaging,我们有一个每天重新启动轮询器的 cron 作业,这可以在不担心丢失任何消息的情况下完成。但是使用 EventMachine,如果我们重新启动进程,我们可能会丢失数百条正在处理的消息。我能看到的唯一方法是在 EventMachine 之上构建一个持久性/可靠的交付层。
有没有人有更好的方法?可靠地执行大量异步 IO 绑定操作的最佳方法是什么?