【问题标题】:process "events" async with elixir and phoenix [closed]与 elixir 和 phoenix 异步处理“事件”[关闭]
【发布时间】:2016-04-01 23:28:31
【问题描述】:

我正在使用 phoenix 控制器通过 REST 调用接收数据。因此,iOS 应用程序可以为每个用户发送“事件”,并根据事件,我需要计算分数/分数并将其发送回用户。计算和发送回用户可以异步进行。我正在使用 Firebase 与用户交流。

什么是计算的好模式?计算可能是一堆数据库查询,以确定该事件的分数。这个计算应该在哪里进行?后台工作人员 GenEvent 在用户特定的 GenServer 中流式传输(我监督了每个用户的 GenServer)。

【问题讨论】:

  • 我仍然有点不清楚您最终要完成什么。你还在用channels吗?
  • 请查看更新后的描述
  • 所以要明确一点,您实际上并没有通过对 REST 调用的响应发回信息?
  • 我不能权威地说话,但我认为你想要的是一个任务:elixir-lang.org/getting-started/mix-otp/…
  • 正确。除了 200 OK 之外,REST API 不会得到任何响应。 GenEvent 呢?

标签: phoenix-framework gen-server elixir


【解决方案1】:

我会看看Phoenix channelstasksGenServer

此外,如果您想管理一组 GenServer 工作人员来进行计算并可能为您发回结果,请查看Conqueuer。我编写了这个库,它正在我公司的生产系统中使用。它使用poolboy,这可能是 Erlang/Elixir 中最普遍的池管理库。

诚然,我并不完全了解您系统的要求,但在我看来,GenEvent 在您的要求中没有一席之地。 GenEvent 是关于将事件分发给一个或多个事件消费者。因此,除非您有一个需要订阅从系统其他部分发出的事件的进程图,否则我看不到它的作用。

【讨论】:

  • 我最终使用了 Conqueuer 库。
  • 是否可以获取worker的实例?我正在使用 RethinkDB elixir 客户端驱动程序,它需要将连接初始化为 defmodule FooDatabase do use RethinkDB.Connection end 所以我在 conqueuer 中将我的工作人员定义为 FooDatabase。
  • Conqueuer 没有公开访问工人的方法,因为有工人池。您应该将工作传递给池,它会为您处理它,具体取决于您的命名,例如:Conqueuer.work(:foo_databases, some_args_here)。如果您试图从您的工人池中获得对特定工人的访问权限,我会质疑您的设计。你真的需要游泳池吗?你真的需要直接访问工人吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 2011-08-03
相关资源
最近更新 更多