Concurrency 将消息路由到Erlang中的PID

Concurrency 将消息路由到Erlang中的PID,concurrency,routing,erlang,otp,ets,Concurrency,Routing,Erlang,Otp,Ets,我正在用erlang编写一个服务器,它处理大量的消息(记录)。 每个消息都有一个类似于用户id的标记(atom) “路由器”将为该用户生成一个专用的永久进程(在保存和传递消息之前积累几分钟),如果该进程不存在的话。否则,它会将其作为消息传递到现有进程邮箱 问题是路由表的簿记 我可以考虑序列化路由器,每条消息都会导致ETS查找,根据用户ID查找PID,如果没有退出,则最终生成并插入ETS。但几秒钟后就堵塞了 另一种方法是直接生成一个进程来路由每条消息,但如果发送给单个用户的几条消息连续出现,并且在

我正在用erlang编写一个服务器,它处理大量的消息(记录)。 每个消息都有一个类似于用户id的标记(atom)

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

问题是路由表的簿记

我可以考虑序列化路由器,每条消息都会导致ETS查找,根据用户ID查找PID,如果没有退出,则最终生成并插入ETS。但几秒钟后就堵塞了

另一种方法是直接生成一个进程来路由每条消息,但如果发送给单个用户的几条消息连续出现,并且在ETS中找不到相应的PID,并且生成了永久进程,则可能会导致争用情况。消息将丢失,只有最后生成的进程才有效(覆盖ETS中的其他进程),其他进程将处于空闲状态且未被跟踪


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

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

您可能需要考虑使用Erlang OTP <代码> GeNoServer < /C>。你可以阅读更多关于它的信息,还有


此外,如果您要从许多进程访问ETS,您可能需要考虑<代码> {Read OnCurror,Trase} /Cuth>和<代码> {Read TyrOnCurror,Trase} /Cuth>选项。阅读更多关于它的信息。

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


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

谢谢。我正在使用otp gen_服务器。我将使用您提到的read_并发。并将实现第一个解决方案的变体。在这里,我为每条消息生成一个进程,只是为了执行ets查找。如果找不到,gen_服务器将提供一个新的派生工作程序并更新ets表。我会回来告诉你事情的经过。现在,我为每条消息实现了一个流程来进行路由。然后是每个用户接收这些消息的进程。gen_服务器负责生成和记录用户进程。在我根据A.Sarid的答案设置Ets选项后,该解决方案在实际流量中运行良好。此外,您还要求用户进程进行监听,因此不需要路由。这是不可能的。在这种情况下,消息以记录的形式来自同一个RPC。如果消息源每个用户都有一个socket/pid,那就太棒了。