通常、インスタントタイムリープが発生した場合にエラーに対して脆弱なのはデータベースサーバーではなく、その時間を使用するアプリケーションです。
通常、時間を追跡するには、独自の時間追跡とシステム時間の比較の2つの方法があります。両方とも、いくつかのプラスとマイナスのトレードオフがあります。
独自の時間追跡
これは、正確なタイミングがそれほど重要ではない一部の組み込みプログラミングおよびシステムで使用されています。メインアプリケーションループでは、「ティック」を追跡する方法が考慮されます。これは、経過時間を示すカーネル、スリープ、または選択によって与えられるアラームである可能性があります。経過時間がわかっている場合、この時間をカウンターに加算または減算できることがわかります。このカウンタは、タイミングアプリケーションを発生させるものです。たとえば、カウンタが10秒を超える場合、何かを破棄するか、何かをする必要があります。
アプリケーションが時間を追跡しない場合、カウンターは変更されません。これは、アプリケーションの設計によっては望ましい場合があります。たとえば、長時間実行プロセスが処理に要する時間を追跡することは、開始/停止タイムスタンプのリストよりもカウンターの方が簡単です。
プロ:
- システムクロックに依存しない
- 大きな時間のずれで壊れない
- 高価なシステムコールなし
- 小さなカウンタは、完全なタイムスタンプよりも少ないメモリで済みます
短所:
- 時間はあまり正確ではありません
- システム時間の変更により、さらに不正確になる可能性があります
- タイミングはアプリケーションの実行に関連しており、持続しません
システム時間の比較
これはより頻繁に使用されるシステムです。タイムスタンプを保存し、システム時間呼び出しを使用してタイムスタンプと比較します。システム時間の大幅なスキューは、アプリケーションの整合性を脅かす可能性があります。数秒のタスクは、クロックの方向によって数時間かかるか、すぐに終了する可能性があります。
プロ:
- 正確な時間比較
- 再起動と長時間の停止を繰り返します
短所:
- システムコールを取り、新しいタイムスタンプを取得して、他のタイムスタンプと比較します
- アプリケーションはスキューに注意する必要があるか、壊れる可能性があります
影響を受けるシステム
ほとんどのアプリケーションは、タイムスタンプ比較を使用してタスクをスケジュールします。キャッシュのクリーンアップが可能なデータベースシステムの場合。
データベースを使用し、クエリ言語で時間関数を呼び出すすべてのアプリケーションは、アプリケーションがそれに応じて検出および処理しない場合、スキューの影響を受けます。アプリケーションは、目的に応じて実行を停止したり、無期限のログイン期間を許可したりすることはできません。
メールシステムは、古くなったメールや未配達のメールを処理するためにタイムスタンプやタイムアウトを使用します。クロックスキューはそれに影響を与える可能性がありますが、影響ははるかに小さくなります。サーバーへの再接続に関するバックオフタイマーが失われると、接続サーバーでペナルティが発生する可能性があります。
システム時間を変更すると、カーネルアラームが鳴るとは思いません(調査していません)。これらを使用するシステムは安全です。
解決策
ゆっくり時間を移動します。これは、お気に入りの時間ソリューションのドキュメントに記載されています。
now()
ます。時間を変更する安全な方法を回答に追加できますか?