【问题标题】:Erlang: Session management and timeoutErlang:会话管理和超时
【发布时间】:2009-11-10 00:54:54
【问题描述】:

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

  1. 创建一个计时器以从管理器中删除过期会话
  2. 为每个会话创建计时器

第一个解决方案在未处理所有会话时锁定服务器(锁定问题)。第二种解决方案需要处理每个会话(内存问题)。

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

谢谢!

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

    【讨论】:

    • 你说得对,但是每个计时器处理程序都会被新进程调用。如果一次调用多个处理程序,将创建许多进程。
    • 为什么要用机关枪杀死苍蝇?
    • 抱歉,send_after 不创建进程。我的意思是 timer:apply_after 函数。
    【解决方案2】:

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

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

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

    【讨论】:

    • 你想说第一个解决方案是有道理的。对吗?
    • 是的,我是说#1 的总体策略更符合清理活动的价值。我不明白的是“锁定服务器”。
    • gen_server 具有会话状态,可以使用回调函数创建或删除。为了实施策略#1,我将创建新的回调函数,例如:handle_call({remove_expired_session} ...)。当计时器调用该函数时,另一个调用将等到 remove_expired_session 完成。它看起来像锁。
    • 对我来说更像是延迟。在某一时刻,您必须进行一些清理处理,不是吗?如果您担心您在此特定流程中的活动持续时间,您可以随时使用其他流程并拆分作业,不是吗?
    • 是的。没错,如果清理程序需要很多时间,我可以拆分工作。
    【解决方案3】:

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

    工作进程直接查找现有会话并在 ets 表中创建新会话(无需任何服务器干预)。如果会话已死,工作进程也会在成功查找后检查。如果是这样,它会创建一个新会话,并删除旧会话。由于ets表不需要排序,可以开启写并发。

    “会话服务器”的角色是拥有会话表,并时不时地产生一个清理进程。这是一个低优先级进程,它通过 ets:next() 调用遍历 ets 表,并删除过期的会话。

    请注意,不涉及计时器。

    【讨论】:

    • 工作进程为什么要创建会话?在 Web 应用程序中,http 请求创建会话。
    • @Zed:这次你很神秘。
    • 工作进程是指实际处理 http 请求本身的进程。例如。在 mochiweb 中执行注册循环功能的人。
    • 无论如何,我的观点是根本没有理由使用计时器。死会话不会导致额外的系统负载或内存使用;那为什么还要为每个会话使用计时器如此准确地杀死它们呢?
    • @Zed:应用程序的另一部分可能依赖于会话的生命周期。例如基于http的在线信息或消息系统。
    【解决方案4】:

    只要您没有大量的会话,任何建议的解决方案都不会出错。我的意思是你应该进行基准测试。

    定时器模块被实现为一个有序的 ets 表,其中 ets:first 可以有效地找到第一个应该过期的定时器并休眠直到发生。所以通过定时器模块添加几千个定时器是没有问题的。每个会话一个。

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

    这就是我觉得没有功能要求的人可以做到的具体程度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 2011-07-01
      • 2011-01-18
      • 2017-04-01
      • 1970-01-01
      • 2015-10-10
      • 2011-01-01
      相关资源
      最近更新 更多