私は定期的に多数の IO バインド操作を実行する必要がある Rails アプリケーションに取り組んでいます。これらの操作は非同期で実行できます。たとえば、システムは 1 日に 1 回、ユーザーごとに Salesforce.com にクエリを実行して、追跡しているユーザーの現在のアカウント (会社) のリストを取得する必要があります。これにより、膨大な数 (潜在的に > 100k) の小さなクエリが発生します。
私たちの現在のアプローチは、ActiveMessaging で ActiveMQ を使用することです。各ユーザーは、異なるメッセージとしてキューにプッシュされます。次に、コンシューマーはユーザーをキューから引き出し、Salesforce.com にクエリを実行し、結果を処理します。しかし、このアプローチはひどいパフォーマンスをもたらします。1 つのポーラー プロセス内では、一度に 1 人のユーザーしか処理できません。したがって、Salesforce.com クエリはシリアル化されます。文字通り何百ものポーラー プロセスを実行しない限り、ポーラーを実行しているサーバーを飽和状態に近づけることはできません。
代替手段として EventMachine を検討しています。これには、単一の EventMachine プロセス内で多数の Salesforce.com クエリを同時に開始できるという利点があります。そのため、サーバーの優れた並列処理と使用率が得られます。
しかし、EventMachine には 2 つの問題があります。1) ActiveMQ/ActiveMessaging で得られた信頼性の高いメッセージ配信が失われます。2) EventMachine を定期的に再始動して、メモリー増加の影響を軽減することは容易ではありません。たとえば、ActiveMessaging では、1 日に 1 回ポーラーを再起動する cron ジョブがあり、これはメッセージを失うことを心配することなく実行できます。しかし、EventMachine では、プロセスを再開すると、進行中の何百ものメッセージが文字どおり失われる可能性があります。これを回避できる唯一の方法は、EventMachine の上に持続性と信頼性の高い配信レイヤーを構築することです。
誰もがより良いアプローチを持っていますか? 大量の非同期 IO バウンド操作を確実に実行するための最良の方法は何ですか?