MySQL / MSSQL-処理のレコードをチェックアウト - スケーリング?
-
28-09-2019 - |
質問
SQLデータベースに処理キューメカニズムを実装するための最も効率的でスケーラブルな方法を把握しようとしています。それ以外は、関連する「バックリンク」統計を持つ「ドメイン」オブジェクトの束があります。どのドメインがバックリンクを処理する必要があるかを効率的に把握したいと思います。
ドメイン テーブル: id、domainname
バックリンク テーブル: id、domainid、count、checkedtime
バックリンクテーブルには、1つのドメインレコードに対して(履歴を維持するために)多くのレコードがあります。バックリンクを処理する予定のドメインを効率的に選択する必要があります。これは、最新のチェックタイムでのバックリンクレコードが過去に十分であること、またはドメインレコードのバックリンクレコードがまったくないことを意味します。ドメインは、最初に最も古いチェックタイムによる注文を含む、多くの要因によって処理を注文する必要があります。
複数の「リーダー」処理ドメインがあります。同じドメインが2回処理される場合、それは大したことではありませんが、CPUサイクルの無駄です。
ワーカーは、ドメインを処理するのに不定期の時間をかけます。何らかの理由で労働者が失敗した場合に備えて、ワーカープロセスが記録を明示的に「チェックイン」することを要求するのではなく、チェックアウトが「期限切れ」になるという意味で、ある程度のバックアップを持ちたいと思います。
ここでの大きな問題はスケーリングです。最初から約200万のドメインが簡単になり、その数は毎日成長し続けます。これは、私のバックリンクの履歴も急速に成長することを意味します。場合によっては毎日処理されると予想されているため、各ドメインで毎週他のケースが処理されることを期待しています。問題は、バックリンク処理を必要とするドメインを見つける最も効率的な方法は何ですか?
ご協力いただきありがとうございます!
解決
私は物事を少し違った形で構成することにしました。いくつかのテーブルの基準に基づいて処理する必要があるドメインを見つける代わりに、特定のドメインに対して各メトリックを処理する必要がある日付を割り当てています。これにより、これらのドメインがクエリをより簡単に処理する必要があることを見つけることができます。
最終的に、処理するドメインを見つけ、バッチIDで処理されているものとしてドメインをマークし、それらのドメインをワーカーに戻すバッチのアイデアを使用しました。ワーカーが完了すると、結果が返され、バッチが削除され、ドメインは将来的に自然に再び処理できるようになります。