0

我正在开发一个项目,让用户可以在私人聊天室与专家聊天。用户购买积分与专家聊天,他们将在每次聊天结束时根据他们交谈的分钟数付费。每个专家每分钟聊天都有不同的信用率。

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


这是一个简单的场景......
用户当前拥有: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 来处理实时聊天。

提前致谢。

4

1 回答 1

0

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

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

这可能带来的问题:

  • 结束时间是什么时候? 那是聊天程序通过会话超时、专家结束或用户结束关闭的时间。根据您的计费结构,我建议在这种情况下使结束时间也包括会话暂停。为了计算成本,可以离散地计算每个开始-暂停迭代(尽管理想情况下,它们会在计费摘要中组合在一起)。您可以在每次发送消息时检查用户是否仍有信用。
  • 空闲时间呢?我们如何解释用户在消息之间的空闲时间超过他们的时间? 应该没关系,真的。下次发送消息时,您可以告诉他们他们已过期。他们可能会因为花了几分钟输入一条不会发送的消息而感到恼火,但有一些方法可以避免这种情况。
    • 如果您每次发送消息时都检查帐单,则很容易注意到它们何时用尽,并发出警告。
    • 这是一种完全不同的计费方式:一旦会话开始,您的服务器可以根据费率和余额计算会话可以持续多长时间。除非在此之前有停止或暂停事件,否则您确切知道他们何时会用完信用,并且如果从暂停中恢复,您可以根据剩余时间重新计算。

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

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

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

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

于 2013-04-17T18:35:01.177 回答