Websocket 是否有人曾经有过Registry.dispatch只是随机停止发送事件?

Websocket 是否有人曾经有过Registry.dispatch只是随机停止发送事件?,websocket,registry,elixir,dispatch,Websocket,Registry,Elixir,Dispatch,我有一个应用程序,它使用websocket提要中的事件。它调用Registry.dispatch/3将消息发送到订阅的genserver,然后genserver将消息打印到控制台。管道由genstage处理。生产者坐在套接字上,用receive calls生成事件。然后,如果状态以特定方式受到影响,使用者将管理状态并向注册表中的进程发送事件。订阅注册表的进程通过handle\u info/2接收消息时会记录事件 运行应用程序约20分钟后,事件将停止记录到控制台,而不会发生任何事情。在控制台中,我

我有一个应用程序,它使用websocket提要中的事件。它调用
Registry.dispatch/3
将消息发送到订阅的genserver,然后genserver将消息打印到控制台。管道由genstage处理。生产者坐在套接字上,用receive calls生成事件。然后,如果状态以特定方式受到影响,使用者将管理状态并向注册表中的进程发送事件。订阅注册表的进程通过
handle\u info/2
接收消息时会记录事件

运行应用程序约20分钟后,事件将停止记录到控制台,而不会发生任何事情。在控制台中,我查看了注册表进程,发现这些进程已取消订阅,因为没有与该项关联的注册表,但没有抛出错误,一切都以静默方式发生。我仍然在获取事件,因此genstage使用者仍然在消费事件,并且它在注册表调度点中断。我可以验证websocket连接没有关闭,事件仍在读取中

这是一个可复制的问题。每次运行时,事件在大约相同的延迟后停止打印,这令人费解。这会让我觉得某个地方有某种泄漏,但观察器上的负载图似乎表明一切正常

免责声明:我完全是长生不老药的初学者,我可能只是错过了一些显而易见的琐碎的东西,但超出了我的知识范围

管道由
GenStage
处理

这看起来像是GenStage处理需求时的死锁。一旦消费者发送需求,而生产者从
handle\u demand
返回一个空的事件列表,消费者就会停止发送需求

这是生产者的责任,生产者有义务收集请求的需求,并在之后提供服务

管道由
GenStage
处理

这看起来像是GenStage处理需求时的死锁。一旦消费者发送需求,而生产者从
handle\u demand
返回一个空的事件列表,消费者就会停止发送需求


这是生产者的责任,生产者有责任收集请求的需求并在之后提供。

Hey。因此GenStage使用者实际上做了两件事:写入ets表,并通过Registry.dispatch发送事件。我可以看到ets表仍在被写入,但订阅到注册表的进程没有接收调度事件。这就是为什么我不认为这是一个GenStage问题。因此GenStage使用者实际上做了两件事:写入ets表,并通过Registry.dispatch发送事件。我可以看到ets表仍在被写入,但订阅到注册表的进程没有接收调度事件。这就是为什么我不认为这是一个氏族问题。