我正在将记录写入记忆失调症,应该保存在那里 仅在允许的时间(24小时)内。 24小时之后,在用户修改其中的一部分之前, 系统应自动将其删除。例如,给用户免费通话时间(用于语音通话) 他们应该在给定的时间内使用。如果他们不使用它,则24小时后,系统应 从用户记录中删除这些资源保留。

现在,这带来了计时器。记录结构的一个示例是: 通用标签

记录中的计时器对象很重要,因为如果用户 最终在超时之前使用保留的资源 (或超时),系统可以调用timer:cancel/1来缓解 此对象的计时器服务器。 现在的问题是,我有两种处理这些记录上的计时器的方法:

选项1:交易中处理的计时器 通用标签

关于上述选项。

Mnesia文档说,TM经理可能会重复进行交易(由于某种原因) 直到它们成功为止,因此当您放置与io:format/2或任何其他无关的代码时 写入或读取,它可能会执行多次。这句话让我在这一点上停顿了一下 并想到了一种可以自行处理事务中计时器的方法,因此我将代码修改为 如下:

选项2:在交易之外处理的计时器 通用标签

处理预留时间的代码: 通用标签

现在我认为在选项2中,通过保持计时器处理,我会更安全 即使mnesia_tm由于其原因重新执行了事务,也可以将其代码化 ,这段代码不会运行两次(我避免使用多个计时器对象 反对相同的记录。

问题1:这两个实现中哪一个是正确的?和/或错?告诉我 他们俩都错了吗

问题2:模块计时器,它非常适合处理大量计时器 生产中的工作?

问题3:与肖恩·欣德(Sean Hinde)的 timer_mn-1.1 , 在mnesia之上运行的计时器模块(可能在Ets表顶部运行)少了 有能力(真正的)生产? (我问这是因为出现在本身正在使用mnesia的系统上使用Sean Hinde的timer_mn 就架构变更而言是一个问题,例如节点问题等)

如果有人用另一种方式处理与失忆有关的计时器相关问题,请更新我 谢谢你们...

有帮助吗?

解决方案

问题1:

在事务之外处理计时器。当交易在Mnesia中发生冲突时,只需重复进行。这将为您提供多个计时器参考和两个计时器触发器。本身不是问题,但是如果在安装计时器之前等到事务成功,就可以避免该问题。

第二种解决方案是我会做的。如果发送正常,则可以在其上安装计时器。如果计时器触发并且没有对该对象的引用,那就没关系。您只需要担心这种情况是否会发生很多,因为那时您将有大量的流浪计时器。

问题2:

计时器模块很简洁,但是性能指南建议您改用erlang:start_timer BIF,请参见

http://www.erlang.org/doc/efficiency_guide/commoncaveats。 html#id58959

我将介绍一个单独的过程,作为处理计时内容的gen_server。您向它发送一个remove(timer:hours(24), RefNo)消息,然后它启动一个计时器,获取一个TRef并在Mnesia或ETS中安装一个映射{TRef, RefNo, AuxData}。当计时器触发时,该过程可以产生一个助手,从主表中删除RefNo条目。

这时,您必须怀疑崩溃。删除gen_server可能会崩溃。另外,整个节点可能会崩溃。在这种情况下,如何重新安装计时器由您决定,但是您应该考虑一下这种情况,以便解决。假设我们再次出现,并且计时器信息从磁盘加载。您如何计划重新安装计时器?

一种方法是让AuxData包含有关超时点的信息。每隔一小时或十五分钟,您就会扫描所有桌子,并删除不应该在那里的人。实际上,您可以选择这作为删除计时器结构的主要方法。是的,在最坏的情况下,您将给人们15分钟的额外时间,但是在代码方面可能更容易处理。至少它可以更好地处理节点(以及计时器)死亡的情况。

另一种选择是作弊,并且仅将计时严格地存储在数据结构中,这使得在最近5分钟内找到所有过期的RefNo 非常便宜,然后每5分钟运行一次。批量处理可能会更有效。例如,操作系统内核经常使用这种批量处理。

问题3

我对timer-tm一无所知,对不起:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top