Erlang:会话管理和超时

时间:2009-11-09 13:40:29

标签: erlang

我正在编写http会话管理器(基于gen_server)。该服务器从内存存储中创建和删除会话。我需要在超时时删除过期的会话。我有两个解决方案:

  1. 创建一个计时器以从管理器中删除过期的会话
  2. 为每个会话创建计时器
  3. 第一个解决方案在未处理所有会话时锁定服务器(锁定问题)。第二个解决方案为每个会话(内存问题)进行处理。

    问题是哪种解决方案是正确的?

    谢谢!

4 个答案:

答案 0 :(得分:5)

使用timer:send_aftertimer:exit_aftertimer:kill_aftertimer模块将ets用于商店计时器,整个VM只有一个gen_server。在每个会话记录中存储计时器参考,以便重新启动计时器。这是简单而干净的解决方案。

答案 1 :(得分:2)

低频事件应由低频过程IMO处理。你不想在没有“产生”价值的事情上“花费”太多资源。

“清理”活动似乎不需要“锁定”服务器。也许你需要扩展这一点。

为什么你需要在解决方案#1中“锁定”某些东西?你有什么顾虑吗?请详细说明您的疑虑,以便我提供更多建议。

答案 2 :(得分:1)

这就是我在宠物“网络框架”中处理会话的方式。

工作进程直接查找现有会话并在ets表中创建新会话(无需任何服务器干预)。如果会话已经失效,工作进程也会在成功查找后进行检查。如果是,则创建新会话,并删除旧会话。由于无需对ets表进行排序,因此可以启用写并发。

“会话服务器”的作用是拥有会话表,并且不时产生清理过程。这是一个低prio进程,通过ets表和ets:next()调用,并删除过期的会话。

请注意,没有涉及计时器。

答案 3 :(得分:0)

只要您没有多少会话,就不会出现任何建议的解决方案。我说的就是你应该做基准测试。

计时器模块实现为一个有序的ets表,其中ets:首先可以有效地找到应该到期的第一个计时器,直到发生这种情况为止。因此通过定时器模块添加数千个定时器没有问题。每个会话一次。

如果你有很多会话,那么设置故障安全的问题可能是一个更大的问题。您需要分发会话数据库,以便可以对请求进行负载平衡,并且您不会受到任何一台Web服务器计算机故障的影响。

这就是我觉得没有功能要求的具体情况。