有没有人有过Registry.dispatch只是随机停止调度事件?

时间:2017-12-01 04:39:11

标签: websocket registry elixir dispatch

我有一个应用程序,它使用来自websocket feed的事件。它调用Registry.dispatch/3向订阅的genservers发送消息,然后将其打印到控制台。流水线由genstage处理。生产者坐在套接字上并使用接收调用生成事件。然后,如果状态以特定方式受到影响,则使用者管理状态并将事件分派给注册表中的进程。订阅注册表的进程会在通过handle_info/2收到消息时记录该事件。

运行应用程序约20分钟后,事件将停止记录到控制台而不会发生任何事情。在控制台中,我查看了注册表进程并看到进程已取消订阅,因为没有与该密钥相关联的注册表,但没有抛出任何错误,一切都是静默发生的。我还得到了一些事件,因此这个阶段性的消费者仍在消费事件,并且在注册表调度点处破坏了它。我可以验证websocket连接没有关闭,事件仍在被读取。

这是一个可复制的问题。在每次运行大约相同的延迟之后,事件停止打印,这是令人困惑的。这会让我觉得某处有某种泄漏,但观察者的负载图似乎表明一切都很好。

免责声明:我是Elixir的初学者,我可能只是缺少一些明显而微不足道的东西,但在我的知识范围之外。

1 个答案:

答案 0 :(得分:0)

  

流水线由GenStage处理。

这看起来像GenStage处理需求的僵局。一旦使用者发送需求,并且生产者handle_demand返回一个空的事件列表,消费者就会停止发送需求

这是done on purpose 生产者的职责是收集所请求的并随后提供