我正在开发一个项目,让用户可以在私人聊天室与专家聊天。用户购买积分与专家聊天,他们将在每次聊天结束时根据他们交谈的分钟数付费。每个专家每分钟聊天都有不同的信用率。
计时器在聊天会话开始时开始计数,并定期通知用户他们在聊天室上花费的总时间和当前聊天会话的当前总积分。这些计算必须在服务器端进行并保存在数据库中。顺便说一句,专家可以暂停/恢复聊天会话。
这是一个简单的场景......
用户当前拥有:10 积分
“专家 A”需要 2 积分/每分钟
CurrentTime Event Timer Credit
- 10:40 聊天开始 00:01 min 2credits
- 10:41 他们在聊天 00:02 mins 4credits
- 10:42 闲置专家 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 来处理实时聊天。
提前致谢。