【发布时间】:2013-04-18 16:49:57
【问题描述】:
我正在开发一个项目,让用户可以在私人聊天室与专家聊天。 用户购买积分与专家聊天,他们将在每次聊天结束时根据他们交谈的分钟数付费。每个专家每分钟聊天的信用率不同。
一个计时器在聊天会话开始时开始计时,并定期通知用户他们在聊天室上花费的总时间和当前聊天会话的当前总积分。这些计算必须在服务器端进行并保存在数据库中。顺便说一句,专家可以暂停/恢复聊天会话。
这是一个简单的场景...
用户当前拥有:10 个积分
“专家A”要求2学分/每分钟
CurrentTime Event Timer Credit
- 10:40 聊天会话开始 00:01 分钟 2credits
- 10:41 他们在聊天 00:02 分钟 4credits
- 10:42 Expert on idle 00:02 mins 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 来处理实时聊天。
提前致谢。
【问题讨论】:
-
听起来您需要准确衡量聊天开始/停止/暂停/恢复的时间。如果您使用的聊天系统不提供该功能,那么您可能每秒(或几秒钟)存储所有活动聊天会话的列表,并每 15 秒使用此数据来完成更昂贵的工作以完全处理一切。请注意,如果您无法在 10 秒内处理当前负载,那么它只需增加 50%,您也无法在 15 秒内完成。因此,您可能很快就必须考虑提高效率或增加容量。
-
为什么要批量运行这些计算?我认为让它成为事件驱动会更简单:每 n 次通过聊天程序发送一条消息(来自专家或用户),检查花费的总时间并计算信用并采取行动因此从那里开始。这样一来,它是针对每个聊天会话进行的,并且比批量分析所有会话更精确且更容易扩展。
-
@ScottMermelstein 有很多不同的情况,例如如果专家 2 分钟或更长时间没有写信,则暂停聊天会话。所以我认为我必须使用一个计时器。可能,如果有人在你的方法上没有写 2 分钟,我将无法检测到用户是否用尽了信用。
-
您可以让聊天的一侧或另一侧成为计算时间的“大师”。如果用户提出问题而专家从不回应,那么真的不应该收取任何费用。专家回复后,您可以使用该回复的时间戳来计算当前聊天时长等。
标签: c# asp.net-mvc algorithm signalr