我正在研究定期需要执行大量IO绑定操作的Rails应用程序。这些操作可以异步执行。例如,每天一次,对于每个用户,系统需要查询Salesforce.com以获取用户当前正在跟踪的帐户(公司)列表。这导致大量的数据(可能大于10万)的小型查询。在Rails中执行大量的异步IO绑定操作
我们目前的方法是使用ActiveMQ和ActiveMessaging。我们的每个用户都会作为不同的消息被推送到队列中。然后,消费者将用户从队列中拉出,查询Salesforce.com并处理结果。但是这种方法给我们带来了可怕的表现。在单个轮询器流程中,我们一次只能处理一个用户。因此,Salesforce.com查询将被序列化。除非我们直接运行数百个轮询器进程,否则我们无法接近饱和运行轮询器的服务器。
我们正在寻找EventMachine作为替代方案。它的优点是允许我们在单个EventMachine进程中同时启动大量的Salesforce.com查询。所以,我们得到了很好的并行性和我们的服务器的利用率。
但EventMachine存在两个问题。 1)我们使用ActiveMQ/ActiveMessaging失去了可靠的消息传递。 2)我们无法定期轻松重启我们的EventMachine以减少内存增长的影响。例如,使用ActiveMessaging,我们有一个cron作业,每天重新启动一次轮询器,这可以在不担心丢失任何消息的情况下完成。但是通过EventMachine,如果我们重新启动流程,我们可能会丢失数百封正在进行的消息。我能看到的唯一方法是在EventMachine之上构建一个持久/可靠的传递层。
有没有人有更好的方法?可靠地执行大量异步IO绑定操作的最佳方式是什么?
建议的解决方案是否必须在多个核心或盒子上运行?换句话说,单个线程是否受CPU限制? – 2010-01-25 19:00:52