我正在开展一个项目,该项目允许用户与私人聊天室的专家聊天。 用户购买积分与专家聊天,他们将在每个聊天会话结束时根据他们谈话的分钟收取费用。每位专家在聊天的每一分钟都有不同的信用率。
计时器在聊天会话开始时开始计时,并且定期通知用户他们在聊天室上花费的总时间以及当前聊天会话的当前总积分。这些计算必须在服务器端进行,并保存在数据库中。 Btw聊天会话可以由专家暂停/恢复。
<小时/> 这是一个简单的场景......
CurrentTime Event Timer Credit
客户需支付8个学分。 他还有2个学分。
聊天会话将在新分钟开始时收费, 计算将根据分钟进行,秒将被省略。
<小时/> 我的问题是如何在服务器端为每个正在以正确方式进行交谈的聊天会话进行这些计算?
我目前的做法是;
服务器端计时器每15秒打一次,获取当前聊天 正在谈论的会议,
对于每个聊天会话:如果聊天会话未暂停,则添加15 秒到会话的时间跨度,然后计算总数 当前会话的信用,如果用户即将用完信用, 通知他,如果他已经没有信用,那么就结束当前的聊天 会话。将这些事务保存到数据库中。更新聊天 会话客户。
但这种方法存在一些缺陷。例如,如果聊天会话现在开始并且计时器在2秒内滴答,那么它会在当前聊天会话的总时间间隔内增加15秒,因此会进行错误计算。 如果我减少计时器的滴答间隔,则可能会有500个当前正在聊天的聊天会话,并且计时器滴答间隔将不足以在10秒内计算每个聊天会话积分。
有没有更好的方法来解决这个问题? 欢迎提出所有建议。
顺便说一下,我使用Asp.net MVC4 C#和Signalr来处理实时聊天。
提前致谢。
答案 0 :(得分:0)
我认为您不必批量执行操作。正如您所说,您会对如何充电的精确度产生问题。我相信你已经意识到快速扩展成为一个问题。让它全部由事件驱动会好得多。
正如我在评论中所建议的那样,其中一部分需要简单地计算完全使用的时间。这很容易 - 存储开始时间(或专家的开始时间,取决于您的偏好),并从结束时间中减去它,并相应地开账单。
这可能带来的问题:
我实际建议你做的是基于最后一个要点。在开始或恢复会话时,根据会话到期时的信用计算。按顺序列表维护会话,按到期时间排序。然后,您的服务器端很容易 - 检查时间是否在任何会话到期时间之后。如果是,请推送结束通知。
在重新阅读您的要求时,我的想法可能过于被动,无法满足您的需求。一个问题是所有计算对服务器端有多重要?我会主张客户端保持会话计时器和成本计算器运行,这样用户就可以在没有客户端/服务器流量的情况下看到它。不过,服务器本身仍然负责计费方面的工作。
否则,如果您必须推送时间和平衡通知,我仍然会单独完成,而不是批量操作。您可以更新每条消息并为每个聊天添加计时器。每次有消息时重置定时器,否则,当定时器触发时,发送时间并平衡更新。或者,如果您没有为那么多计时器提供资源,请对排序列表执行相同的操作 - 每次有活动时更新列表,并在最后一个活动时间+ 15秒进行排序。列表顶部的那些可能需要获得时间和平衡更新。
无论如何,我会专注于为每条消息发送时间和平衡的想法,并找到一种方法让它在那里发挥作用。