2017-05-23 15 views
1

仮想クラウドベースの目覚まし時計プロジェクトを想像してください。これにより、ユーザーは、選択した日時の繰り返しでない「起床」をスケジュールできます。このシステムは非常に大きな数に拡張する必要があります。電話回線数などのことを心配しないでください。スケジュールされたデータベースジョブのスケーラビリティ

質問:データを照会して、誰が今すぐ呼び出される必要があるかを知るにはどうしたらいいですか?スケジュールされたジョブは最良のアプローチですか、スケジュールされたジョブごとに1つのジョブがあるか、定期的に1つのジョブが起きてすべてのクエリをキャッチしますか?仕事が最善でない場合、あなたは何をしますか?

注:コードを探していません。この問題に最善のアプローチをとるためのアーキテクチャ戦略が何であるかを知りたい。

ありがとうございます!

答えて

2

ハードウェアが無限に高速でない場合は、不正確さの可能性を受け入れる必要があります。つまり、12:00に目を覚ましたいと思っているユーザーが実際に12:00:00.002に目を覚ますことがあります。彼らは気にしないでください。

この前提に基づいて、スケジュールされたコールごとに1つのジョブは必要ありません(このようなジョブが無限に多く必要であり、それは非常にうまくスケールできません)。また、定期的に起きるジョブキャッチオールクエリを実行します。 (それは真剣に不自由なことでしょう)

あなたが必要とするのは1つのタイマーだけです。

すべてのアラームから、過去に発生したアラームは無視し、残りのものからは「今」に最も近いアラームを選択します。これは、すべての実際的な目的のために、発砲するのを待っているすべての警報の中で発射する次の警報です。だから、そのアラームのためにあなたのタイマーを起動するように設定します。

タイマーが起動する前に新しいアラームが作成された場合は、それが現在のものに近いかどうかを確認し、タイマーが変更されている場合はタイマーを変更して、タイマーが常に次の警報。

タイマーが起動すると、ユーザーは起床します。時間の分解能が無限に高い場合(つまり、複数のユーザーが同時に同じ時間に目を覚ます必要がある場合)、目を覚ます必要のあるすべてのユーザーが起きます。

次に、「今」に最も近い将来のアラームを検出し、タイマーを再初期化し、次のアラームを待つクエリを繰り返します。

+0

私は分かりません。データベースを常にポーリングすると言っていますか?また、私は "無限"を "非常に大きな数"に変更する答えを編集しました。 – user6943228

+0

タイマーが起動するたびにデータベースをポーリングするだけです。 (もちろん、アラームが追加されるたびに)データベースを常にポーリングするのとはまったく異なります。 –

+0

ポーリングはどのような状況においても最も洗練された解決策であるとは確信していません。私はあなたの答えを投票しましたが、確信していないのは、ポーリングが非常に効率的ではないことで有名なので、これを解決するための非常に堅牢な方法です。 – user6943228

関連する問題