在商业聊天室中计算信用的正确方法是什么?

时间:2013-04-17 16:16:05

标签: c# asp.net-mvc algorithm signalr

我正在开展一个项目,该项目允许用户与私人聊天室的专家聊天。 用户购买积分与专家聊天,他们将在每个聊天会话结束时根据他们谈话的分钟收取费用。每位专家在聊天的每一分钟都有不同的信用率。

计时器在聊天会话开始时开始计时,并且定期通知用户他们在聊天室上花费的总时间以及当前聊天会话的当前总积分。这些计算必须在服务器端进行,并保存在数据库中。 Btw聊天会话可以由专家暂停/恢复。

<小时/> 这是一个简单的场景......
用户当前有:10个积分
“专家A”需要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来处理实时聊天。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我认为您不必批量执行操作。正如您所说,您会对如何充电的精确度产生问题。我相信你已经意识到快速扩展成为一个问题。让它全部由事件驱动会好得多。

正如我在评论中所建议的那样,其中一部分需要简单地计算完全使用的时间。这很容易 - 存储开始时间(或专家的开始时间,取决于您的偏好),并从结束时间中减去它,并相应地开账单。

这可能带来的问题:

  • 结束时间是什么时候?当聊天程序关闭时,通过会话超时,专家结束或用户结束。根据您的结算结构,我会主张在此上下文中使结束时间也包括会话暂停。为了计算成本,可以对每个开始 - 暂停迭代进行离散计数(尽管理想情况下,它们可以在计费摘要中组合在一起)。您可以在每次发送邮件时进行检查,以查看用户是否仍有信用。
  • 空闲时间怎么样?我们如何解释用户闲置的时间比消息之间的时间长?真的应该没关系。下次发送消息时,您可以告诉他们他们已经过期了。他们可能会因为他们花了几分钟键入一条不会被发送的消息而烦恼,但有办法避免这种情况。
    • 如果您每次发送邮件时都会检查结算信息,则可以在发送信息时轻松注意,并发出警告。
    • 这是一种完全不同的计费方式:一旦会话开始,您的服务器可以根据费率计算并平衡会话可以持续多长时间。除非在此之前有停止或暂停事件,否则您确切知道它们何时会用完信用卡,如果暂停时有简历,您可以根据剩余时间重新计算。

我实际建议你做的是基于最后一个要点。在开始或恢复会话时,根据会话到期时的信用计算。按顺序列表维护会话,按到期时间排序。然后,您的服务器端很容易 - 检查时间是否在任何会话到期时间之后。如果是,请推送结束通知。

在重新阅读您的要求时,我的想法可能过于被动,无法满足您的需求。一个问题是所有计算对服务器端有多重要?我会主张客户端保持会话计时器和成本计算器运行,这样用户就可以在没有客户端/服务器流量的情况下看到它。不过,服务器本身仍然负责计费方面的工作。

否则,如果您必须推送时间和平衡通知,我仍然会单独完成,而不是批量操作。您可以更新每条消息并为每个聊天添加计时器。每次有消息时重置定时器,否则,当定时器触发时,发送时间并平衡更新。或者,如果您没有为那么多计时器提供资源,请对排序列表执行相同的操作 - 每次有活动时更新列表,并在最后一个活动时间+ 15秒进行排序。列表顶部的那些可能需要获得时间和平衡更新。

无论如何,我会专注于为每条消息发送时间和平衡的想法,并找到一种方法让它在那里发挥作用。