在商业聊天室计算信用的正确方法是什么?
本文关键字:方法 是什么 聊天室 计算 | 更新日期: 2023-09-27 18:09:36
我正在做一个项目,该项目为用户提供在私人聊天室与专家聊天的功能。用户购买积分与专家聊天,每次聊天结束后,他们将根据谈话的时长收取费用。每个专家每聊一分钟都有不同的积分率。
在聊天会话开始时,计时器开始计数,用户会定期收到关于他们在聊天室中花费的总时间和当前聊天会话的当前总积分的通知。这些计算必须在服务器端进行,并保存在数据库中。顺便说一句,聊天会话可以暂停/恢复由专家。
这里有一个简单的场景……
用户当前拥有:10个积分
"专家A"要求每分钟2学分
CurrentTime Event Timer Credit
- 10:40聊天开始00:01 min2学分
- 10:41他们在聊天00:02分4学分
- 10:42专家空闲00:02分钟4学分(聊天暂停)
- 10:45专家上线00:02分钟4学分(聊天恢复)
- 10:46他们在聊天00:03分6学分
- 10:46客户端结束会话00:04分钟8学分
客户将被收取8个学分。他还有2个学分。
聊天会话将在新一分钟开始时计费,以分计算,秒略。
我的问题是如何使这些计算在服务器端为每一个聊天会话正在谈论目前在一个适当的方式?
我目前的方法是;
服务器端计时器每15秒滴答一次,获取当前聊天正在讨论的会议,
对于每个聊天会话:如果聊天会话没有暂停,则增加15秒到会话的时间跨度,然后计算总数当前会话的积分,如果用户即将用完积分,通知他,如果他的信用已经用完,那么结束当前的聊天会话。将这些事务保存到数据库中。更新聊天记录会话的客户。
但是这种方法有一些缺陷。例如,如果聊天会话现在开始,计时器在2秒内滴答,那么它将当前聊天会话的总时间增加15秒,因此它会产生错误计算。如果我减少计时器的滴答间隔,那么可能有500个当前聊天会话正在交谈,计时器滴答间隔将不足以在10秒内计算每个聊天会话的积分。
有更好的方法来处理这个问题吗?欢迎提出建议。
顺便说一下,我使用Asp.net MVC4 c#和Signalr来处理实时聊天。我认为你最好不要批量操作。正如你所说的,你在如何充电的准确性上遇到了问题。我相信你们已经意识到,快速扩大规模是一个问题。让它完全由事件驱动会好得多。
正如我在注释中所建议的,这部分需要简单地精确计算所使用的时间。这很容易做到-存储开始时间(或专家的开始时间,取决于您的偏好),并从结束时间中减去它,并相应地计费。
可能引起的问题:
- 结束时间是什么时候?这是聊天程序关闭的时间,通过会话超时、专家结束或用户结束。根据您的计费结构,我建议在这种情况下将结束时间也包括会话暂停。为了计算成本,每次开始-暂停迭代都可以被离散地计算(尽管理想情况下,它们应该在帐单汇总中分组)。你可以在每次发送消息时检查用户是否还有信用。
-
空闲时间呢?我们如何解释用户在消息之间空闲的时间比实际时间长?这应该无关紧要,真的。下次发送消息时,你可以告诉他们他们已经过期了。他们可能会因为花了几分钟时间输入一条不会被发送的信息而生气,但有一些方法可以避免这种情况。
- 如果你在每次发送消息时检查账单,很容易注意到它们运行低,并发出警告。 这是一种完全不同的计费方式:一旦会话开始,您的服务器可以根据速率和平衡会话可以持续多长时间来计算。除非在此之前有停止或暂停事件,否则您可以确切地知道它们何时会耗尽信用,如果暂停后有恢复,则可以根据剩余时间重新计算。
我真正建议你做的是基于最后一点。在会话开始或恢复时,根据会话到期的时间计算信用值。在有序列表中维护会话,并按到期时间排序。然后,您的服务器端很容易检查时间是否在任何会话过期时间之后。如果是,则推送结束通知。
重读你的要求,我的想法可能太被动了,不符合你的需要。一个问题是,所有计算都在服务器端有多重要?我主张客户端保持会话计时器和成本计算器运行,这样用户就可以在没有客户端/服务器流量的情况下看到它。不过,服务器本身仍将负责计费方面的事情。否则,如果你必须为时间和平衡而推送通知,我仍然会让它在单独的基础上完成,而不是在批量操作中完成。您可以更新每条消息,并为每次聊天添加计时器。每次有消息时重置计时器,否则,当计时器触发时,发送时间和平衡更新。或者如果你没有那么多计时器的资源,对排序列表做同样的想法——每次有活动时更新列表,并在最后一次活动时间+ 15秒时对其进行排序。那些在列表顶部的可能需要获得时间和平衡更新。
无论如何,我会专注于发送时间和平衡每条消息的想法,并找到一种方法使它从那里起作用。