elixir phoenix提醒功能

时间:2016-05-23 09:03:51

标签: elixir phoenix-framework

我正在玩elixir和phoenix并试图实现提醒功能,即使用未来的日期时间,这应该在该日期时间提醒您。

我有以下天真的解决方案:

1)使用简单的一对一策略,并为每个提醒创建一个进程,该进程将使用超时并在完成后死亡

2)在一个过程中汇总所有提醒,在状态下存储提醒,每隔几秒检查一次日期时间,并在提醒后删除。

有人可以详细说明每个解决方案,并且可能会给出一个更明智的解决方案,谢谢

2 个答案:

答案 0 :(得分:0)

我建议考虑规模。 假设您有一台处理x提醒的服务器:

  1. 在第一个解决方案中,我们有x个进程,每个进程都有自己的计时器,当计时器结束时,它会发送一条消息并死掉。

  2. 在第二个解决方案中,我们将只有一个流程,可能会找到所有相关的提醒并相应地处理它们

  3. x有多大?

    如果x是成千上万且提醒是短暂的,那么也许我会说第一个解决方案更好,因为你有一个更好的容错设计,因为'提醒'被进程分开,但如果x大得多那么它可能无法很好地扩展,你会有很多进程,每个都有一个计时器,这不是真的推荐。

    我想补充一点,如果你有长时间运行的提醒,让我们说一年后的提醒,比你需要让一个进程运行一年直到它到期,这真的无法扩展。

    当您处理大量提醒时,第二个解决方案可以更好地扩展。 你会有一个可能每秒运行一次的计时器,它会汇总大约应该在那时运行的相关提醒并处理它们,长时间运行提醒就不再是问题了。

答案 1 :(得分:0)

我认为第一个选项要好得多,既简单又要,尤其是的可伸缩性。 Erlang旨在以高效的方式处理大量并发运行的轻量级进程。进程也可以分布在集群中的许多机器上,因此您可以实际上扩展到无穷大。

启动一个简单调用send_after/3并使用“通知调度程序”进程作为目标的新流程非常简单且性能影响很小 - 如果出现问题并且该流程终止,您只会丢失一个提醒。所有其他人都是孤立的,仍然会被解雇。

通过将所有提醒存储在一个过程中,您将自己置于一个非常不舒服的位置,原因如下:

  • 如果进程终止,所有的提醒都将消失。这可能是不可接受的,所以你需要想出一种方法来将它们保存到磁盘上,这样你就可以从崩溃中恢复......更多工作,更复杂;
  • 如果提醒的数量增长过高,则每x秒遍历整个列表将是一项昂贵的操作; send_after/3具有更高效的调度/调度机制,它内置于......工作量少,复杂度低;
  • 如果所有内容都在一个大型进程中,则无法在群集中的节点之间分配负载,因此您必须受运行该大型进程的计算机的计算能力的约束。

在大多数编程语言中,并发性很难以安全的方式进行,因此人们就像瘟疫一样避免它。在Elixir和Erlang中,它恰恰相反 - 你想尽可能多地使用它,你会看到明显的收益。分而治之!