0

未読/既読カウンターを維持するメッセージングアプリケーションがあります。現在、この値を1時間キャッシュし、ユーザーがアプリをヒットしてキャッシュの有効期限が切れた場合、データベーステーブルでカウントが行われ、キャッシュされた値が更新されます。

問題は、多数のユーザーが一度にアクセスし、キャッシュの有効期限が切れた場合です。これは実際には非常に一般的です。これにより、すべてのカウントをライブで同時に実行するためにデータベースに多大な負担がかかります。

メッセージを追加または削除するときに、このカウンターをキャッシュにアクティブに維持する方法を見つけたいと思います。これにより、ユーザーはキャッシュされた値に到達するだけで、期限切れになることはありません。新しい問題は、キャッシュの更新をトリガーするメッセージを追加または削除するシステムがカップルを見逃す可能性があるため、カウント値が同期していることを確認することです。そのため、2つの数値は同期しなくなります。

私が思いついたオプションのいくつか:

  • Xが更新されるたびに強制更新を実行します。これはアクティブユーザーにとっては問題ありませんが、アクティブでないユーザーは不正確なカウントを持つ可能性が高く、キャッシュの有効期限がないため、そのカウントは長期間残ります。

  • カウントを更新するバックグラウンドジョブがあります。これには、非アクティブなユーザーにdbリソースを費やしているという問題があり、非効率的で時間がかかります。

このタイプのカウントの維持に関する一般的な提案はありますか?

4

1 に答える 1

3

私はあなたが持っているアプリケーションを100%確信していませんが、あなたが受信メッセージの数と送信メッセージの数を持っているメールクライアントのようなものを持っていると仮定すると、私はいくつかのアイデアを持っています:

  1. キャッシュに関するThunderingHerdのアイデアを確認してください。http: //en.wikipedia.org/wiki/Thundering_herd_problem このアイデアは、常に同じキャッシュ有効期限値を使用するとは限らないということです。ランダム性を導入します。1時間で期限切れになるもの、58分で期限切れになるもの、1時間2分で期限切れになるものがあります。これにより、多くのものが同時に期限切れになるのを防ぎます。

  2. 書き込み側のキャッシュを無効にすることを検討してください。言い換えれば、私が誰かにメッセージを送ったとしましょう。UIで送信すると、コードは他のユーザーのキャッシュを無効にして(受信したカウントが1つ増えただけです)、値を再入力する必要があります。つまり、1回のアプリケーション呼び出しでキャッシュを無効にするだけではありません。それを無効にして、新しい値をプロアクティブにキャッシュに入れます。

  3. スケジュールに従ってキャッシュをシードすることはできますが、あなたが言ったように、必要のない作業を行うことになります。

  4. 多くの大企業がこのような問題を抱えてUIにプッシュしていることに気づきました。一定期間、わずかに一貫性のないデータを許可するか、ちょっとしたトリックを行います。たとえば、メッセージをすばやく「感じ」たい場合にメッセージを送信するときは、カウンターがまだデータベースに保存されていなくても、Javascriptを使用して「送信済み」カウンターを1つ増やします(Webアプリケーションを想定)。

つまり、UIで即座にフィードバックを提供し、少しファッジしてから、非同期でデータを書き込み、書き込み/キャッシュの更新が完了するのを待ちます。

于 2013-01-17T18:15:37.390 に答える