私は、ユーザーがプライベート チャット ルームで専門家とチャットできるようにするプロジェクトに取り組んでいます。ユーザーは専門家とチャットするためにクレジットを購入し、チャット セッションごとに、通話時間に基づいて課金されます。各エキスパートは、チャットの分ごとに異なるクレジット レートを持っています。
タイマーはチャット セッションの開始時にカウントアップを開始し、ユーザーはチャット ルームで費やした合計時間と現在のチャット セッションの現在の合計クレジットについて定期的に通知されます。これらの計算はサーバー側で行い、データベースに保存する必要があります。ところで、チャット セッションはエキスパートによって一時停止/再開できます。
簡単なシナリオを次に示します...
ユーザーの現在の所有: 10 クレジット
「エキスパート A」は 1 分あたり 2 クレジットを要求します
CurrentTime Event Timer Credit
- 10:40 チャットセッション開始 00:01 min 2credits
- 10:41 彼らはチャットしています 00:02 mins 4credits
- 10:42 Expert on idle 00:02 mins 4credits(チャット一時停止)
- 10:45 エキスパートがオンラインになる00:02 mins 4credits(チャット再開)
- 10:46 彼らはチャットしています 00:03 mins 6credits
- 10:46 クライアントがセッションを終了 00:04 mins 8credits
クライアントには 8 クレジットが請求されます。彼には残りの 2 クレジットがあります。
チャット セッションは新しい分の開始時に課金されます。計算は分単位で行われ、秒は省略されます。
私の質問は、現在適切な方法で話されているすべてのチャット セッションに対してサーバー側でこれらの計算を行う方法ですか?
私の現在のアプローチは次のとおりです。
サーバー側のタイマーが 15 秒ごとに作動し、現在話しているチャット セッションを取得します。
すべてのチャット セッション: チャット セッションが一時停止されていない場合、セッションのタイムスパンに 15 秒を追加し、現在のセッションの合計クレジットを計算します。ユーザーがクレジットを使い果たしそうになっている場合は、ユーザーに通知します。クレジットが不足している場合は、現在のチャット セッションを終了します。これらのトランザクションをデータベースに保存します。チャット セッション クライアントを更新します。
しかし、このアプローチにはいくつかの落とし穴があります。たとえば、チャット セッションが今開始され、タイマーが 2 秒でカチカチ音をたてる場合、現在のチャット セッションの合計時間に 15 秒が追加されるため、計算が間違っています。タイマーのティック間隔を減らすと、現在 500 のチャット セッションが話されている可能性があり、タイマーのティック間隔は、たとえば 10 秒ですべてのチャット セッションのクレジットを計算するのに十分ではありません。
これを処理するより良い方法はありますか?すべての提案を歓迎します。
ちなみにリアルタイムチャットはAsp.net MVC4 C#とSignalrでやってます。
前もって感謝します。