在 Erlang 中将消息路由到 PID

Routing messages to PIDs in Erlang

我正在用 erlang 编写一个服务器来处理大量消息(记录)。 每条消息都有一个标签(原子),如用户 ID。

如果此进程不存在,"router" 将为该用户生成一个专用的永久进程(在保存和传递消息之前积累消息几分钟)。否则它将作为消息传递到现有进程邮箱。

问题是路由的簿记table。

我可以考虑序列化路由器,每条消息都会导致 ETS 查找以通过 userId 查找 PID,如果没有退出,最终 Spawn 和 ETS 会插入。但这在几秒钟内就变得拥挤了。

另一种方法是直接生成一个进程来路由每条消息,但是如果发送给单个用户的几条消息连续进入并且没有在 ETS 中找到相应的 PID 并生成,这可能会导致竞争条件永久过程。消息将丢失,只有最后生成的进程有效(覆盖 ETS 中的其他进程),其他进程将闲置且无法跟踪。

我也可能想错了。有没有更好的方法来处理这种情况?

您的第一个解决方案听起来很适合这种情况。对我来说,如果你有大量消息,为你收到的每条消息启动一个进程听起来是不对的。 ETS 速度很快,应该能够处理大量数据。

您可能要考虑使用 erlang OTP gen_server。您可以阅读更多相关信息 here , here, and here

此外,如果您要从多个进程访问 ETS,您可能需要考虑 {read_concurrency, true}{read_concurrency, true} 选项。阅读更多相关信息 here and here

每个用户有一个进程(一台服务器)是一种常见的模式,就像您建议的那样。

有时,如果使用的协议允许,不是将消息从监听所有用户的服务器路由到 "user" 进程,而是在任何连接之前生成一个新进程,监听(等待)一个新用户连接请求。当请求到达时,会产生一个新的等待进程,当前进程会管理与新用户的完整会话(有关详细示例,请参见 learyousomeerlang: a bucket of socket)。