我正在编写http会话管理器(基于gen_server)。该服务器从内存存储中创建和删除会话。我需要在超时时删除过期的会话。我有两个解决方案:
第一个解决方案在未处理所有会话时锁定服务器(锁定问题)。第二个解决方案为每个会话(内存问题)进行处理。
问题是哪种解决方案是正确的?
谢谢!
答案 0 :(得分:5)
使用timer:send_after
,timer:exit_after
或timer:kill_after
。 timer
模块将ets
用于商店计时器,整个VM只有一个gen_server
。在每个会话记录中存储计时器参考,以便重新启动计时器。这是简单而干净的解决方案。
答案 1 :(得分:2)
低频事件应由低频过程IMO处理。你不想在没有“产生”价值的事情上“花费”太多资源。
“清理”活动似乎不需要“锁定”服务器。也许你需要扩展这一点。
为什么你需要在解决方案#1中“锁定”某些东西?你有什么顾虑吗?请详细说明您的疑虑,以便我提供更多建议。
答案 2 :(得分:1)
这就是我在宠物“网络框架”中处理会话的方式。
工作进程直接查找现有会话并在ets表中创建新会话(无需任何服务器干预)。如果会话已经失效,工作进程也会在成功查找后进行检查。如果是,则创建新会话,并删除旧会话。由于无需对ets表进行排序,因此可以启用写并发。
“会话服务器”的作用是拥有会话表,并且不时产生清理过程。这是一个低prio进程,通过ets表和ets:next()调用,并删除过期的会话。
请注意,没有涉及计时器。
答案 3 :(得分:0)
只要您没有多少会话,就不会出现任何建议的解决方案。我说的就是你应该做基准测试。
计时器模块实现为一个有序的ets表,其中ets:首先可以有效地找到应该到期的第一个计时器,直到发生这种情况为止。因此通过定时器模块添加数千个定时器没有问题。每个会话一次。
如果你有很多会话,那么设置故障安全的问题可能是一个更大的问题。您需要分发会话数据库,以便可以对请求进行负载平衡,并且您不会受到任何一台Web服务器计算机故障的影响。
这就是我觉得没有功能要求的具体情况。