オブジェクトのバッチを取得し、それらをキューにパイプして非同期/後で処理するソリューションを設計しています。私は、ワーカーがデータストアにマーシャリング/ヤムリング/何でもされ、別のプロセスで処理される、delayed_job/resque/sidekiq に向けたソリューションをターゲットにしています。
したがって、私が設計した方法では、オブジェクト ID、そのクラス、およびそれぞれで実行する必要がある特定のアクションを受け取るこのワーカーがあります。なぜIDとクラス名を保存するのですか? これらは簡単にマーシャリングできる要素 (文字列、整数) であり、ほとんどのデータ ストアにはマーシャリングされるデータ (列 TEXT など) に対して一定の制限があります。ここまでは順調ですね。
さて、犯人:あそこのアクションが見えますか? メソッド識別子ではありません。これはクロージャーを表します (各オブジェクトを引数として取り、その魔法を実行します)。このクロージャは Proc であり、proc は (WHY、LORD、WHY????) マーシャブルではありません。
だから、これは私の計画を台無しにします。私はどこかにシングルトン識別子を持ち、クロージャーを返す補助隠しメソッドを動的に挿入する戦略を考案しています。そのため、ジョブは ID、クラス名、およびこの補助メソッド ID でマーシャリングされます。ジョブが実行されると、すべてのオブジェクトでアクションが実行され、最後にシングルトン インスタンスからこのメソッドを動的に削除します。これが機能するには、この識別子が一意である必要があり、そのためにプロシージャ クロージャの object_id を使用しています。ここまでは順調ですね。問題は、通常、バックグラウンド キューが、ジョブをキューに入れるプロセスとは別のプロセスでジョブを実行することです。つまり、ジョブが実行されると、proc を返す動的に注入されたメソッドは使用できません。
したがって、私の問題はサブ問題に細分されます。
- オブジェクトに対して実行されるアクションが必ずしも既存のメソッドではない場合、オブジェクトのバッチを後で処理するために効率的にキューに入れる方法は?
- procマーシャリングを回避するには?
- プロセス通信を確立する方法 (サードパーティ テクノロジのメッセージ キューを使用せず、可能であれば単純な Ruby のみ)
私の問題に関する他の戦略を知っている人はいますか? たぶん、共有メモリ、プロセス間通信、その他ですか?それとも、プロシージャを「マーシャリング」するための戦略でしょうか?
アップデート:
DRb を使用したソリューションを考案しました。このソリューションでは、補助メソッドを割り当てるこのシングルトン オブジェクトが DRb オブジェクトとして外部プロセスに提供されます。危険なパブリック API を追加するという欠点があります。誰かが利点/欠点/代替案を知っていますか?