Я работаю над проектом, который предоставляет пользователям возможность общаться с экспертами в частных чатах. Пользователи покупают кредиты, чтобы общаться с экспертами, и с них будет взиматься плата в конце каждого сеанса чата в зависимости от минут, в течение которых они разговаривали. У каждого эксперта разная кредитная ставка за каждую минуту общения в чате.
Таймер начинает отсчет в начале сеанса чата, и пользователи через регулярные промежутки времени уведомляются об общем времени, которое они проводят в чате, и текущих общих кредитах текущего сеанса чата. Эти расчеты должны производиться на стороне сервера и сохраняться в базе данных. Кстати, сеанс чата может быть приостановлен/возобновлен экспертом.
Вот простой сценарий...
Текущий пользователь имеет: 10 кредитов
"Эксперт А" требует 2 кредита в минуту
CurrentTime Event Timer Credit
- 10:40 Начало сеанса чата 00:01 мин 2credits
- 10:41 Они болтают 00:02 мин 4credits
- 10:42 Эксперт в простое 00:02 мин 4credits (пауза в чате)
- 10:45 Эксперт становится онлайн 00:02 мин 4credits (Чат возобновляется)
- 10:46 Они болтают 00:03 мин 6credits
- 10:46 Клиент завершает сеанс 00:04 мин 8credits
С клиента взимается плата в размере 8 кредитов. У него осталось 2 кредита.
Сессии чата будут тарифицироваться в начале новой минуты, расчеты будут производиться на основе минут, секунды не учитываются.
Мой вопрос заключается в том, как правильно выполнять эти расчеты на стороне сервера для каждого сеанса чата, о котором идет речь в данный момент?
Мой текущий подход:
Таймер на стороне сервера срабатывает каждые 15 секунд, получает данные о текущих сеансах чата,
Для каждого сеанса чата: если сеанс чата не приостановлен, то добавляет 15 секунд к промежутку времени сеанса, а затем вычисляет общее количество кредитов текущего сеанса, если у пользователя вот-вот закончатся кредиты, уведомляет его, если он уже запущен закончился, затем завершите текущий сеанс чата. Сохраните эти транзакции в базе данных. Обновите клиенты сеанса чата.
Но есть некоторые подводные камни в этом подходе. Например, если сеанс чата начался сейчас и таймер отсчитывает 2 секунды, то он добавляет 15 секунд к общему промежутку времени текущего сеанса чата, что приводит к просчету. Если я уменьшу интервал таймера, то может быть 500 текущих сеансов чата, и интервала таймера будет недостаточно для расчета кредитов каждого сеанса чата, например, за 10 секунд.
Есть ли лучший способ справиться с этим? Все предложения приветствуются.
Кстати, я использую Asp.net MVC4 C# и Signalr для обработки чата в реальном времени.
Заранее спасибо.