【发布时间】:2021-03-16 18:52:48
【问题描述】:
我见过很多 GenServer 实现,我正在尝试创建一个具有此类规范的实现,但我不确定它的 GenServer 用例。
我有这样的状态
%{url: "abc.com/jpeg", name: "Camera1", id: :camera_one, frequency: 10}
我有这样 100 个状态,具有不同的值,我的用例包含 5 个步骤。
- 将每个状态作为 Gen{?} 开始。
- 向该 URL 发送 HTTP 请求。
- 获取结果。
- 发送另一个 HTTP 请求,数据来自第一个请求。
- 使进程进入睡眠状态。如果频率为 10,则持续 10 秒,依此类推,10 秒后将再次从 1 步开始。
现在,当我启动 100 个这样的 worker 时,将会有 100 * 2 个频繁的 HTTP 请求。我不确定我会使用 GenServer 还是 GenStage 或 Flow 甚至是 Broadway?
我还担心 HTTP 请求不会崩溃,例如一个有状态的工作人员会发送一个请求,如果频率是在第一个请求返回之前 1 秒,另一个请求会被发送, GenServer 有足够的能力处理这些情况吗?我认为这叫做背压?
我一直在询问和研究这个用例这么久,我的用例也被引导到 RabbitMQ。
任何指导都会很有帮助,或者任何最小的例子都会非常感激。
? GenServer/ GenStage / GenStateMachine
【问题讨论】:
-
那肯定不是
Broadway也不是Flow。我在这里也没有看到GenStage的任何应用程序。不久前,我遇到了类似的任务,我已经发布了Tarearbol库,它正是这样做的(除了其他事情之外),一个实现了一种行为,而后面的DynamicSupervisor完成了其余的工作。 -
是否可以启动一个gen server,然后让它在做请求的时候绕一圈移动,保存它,然后再次发送它,然后让自己进入睡眠状态,过一会儿再启动。如果一个请求没有成功,也可以处理其他请求。
-
@JunaidFarooq 可以做类似的事情,如this article 中所述。
标签: erlang elixir gen-server genstage