我正在用 erlang 编写一个处理大量消息(记录)的服务器。每条消息都有一个标签(原子),如用户 ID。
如果该进程不存在,“路由器”将为该用户生成一个专用的永久进程(在保存和传递消息之前累积几分钟的消息)。否则它将作为消息传递给现有的进程邮箱。
问题是路由表的簿记。
我可以考虑序列化路由器,每条消息都会导致 ETS 查找通过 userId 查找 PID,如果它没有退出,则最终 Spawn 和 ETS 插入。但这在几秒钟内就变得拥挤了。
另一种方法是直接生成一个进程来路由每条消息,但是如果发送给单个用户的几条消息接踵而至,并且在 ETS 中找不到它们对应的 PID 并生成了永久进程,这可能会导致竞争状况。消息将丢失,只有最后生成的进程有效(覆盖 ETS 中的其他进程),而其他进程将处于空闲状态且未被跟踪。
我也可能想错了。有没有更好的方法来处理这种情况?