首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于实时网络通信的Erlang和Cowboy

用于实时网络通信的Erlang和Cowboy
EN

Stack Overflow用户
提问于 2014-08-11 12:46:45
回答 3查看 617关注 0票数 2

牛仔将为每个请求生成进程(在这种情况下,它是websocket连接、事件源请求或通过ajax进行长时间轮询)。

在用户之间发送消息是通过发送消息到表示到该用户的连接的适当进程来解决的(如果您有两个用户并且都有websocket支持,那么就有两个进程,每个进程都表示websocket连接)。

假设我有两个用户(Foo,Bar).

Foo希望向Bar发送消息,因此Foo进程必须以某种方式获得与表示与用户Bar连接的牛仔进程相关联的pid (这样他就可以向他发送常规的erlang消息--消息是内部发送给用户him浏览器的)。

但是当Foo获得pid和pid时会发生什么情况呢?因为在此期间用户栏将重新连接(重新连接意味着与Bar关联的进程被终止,并且因为Bar再次连接,他得到了新的进程)?

由于网络问题而重新连接。

,这意味着如果Foo将消息发送到Bar (Foo具有进程pid,已经终止),消息将永远不会被传递。

第一个解决方案是,因为消息应该是持久化的(例如facebook上的消息),所以在将消息发送给用户之前,您总是会将其保存到DB。当用户连接时,必须进行一些同步,因为即使他在网上的时间是99%,也可能有一些没有的按摩。因此,在Foo重新连接后同步时,Bar将从Foo获得消息(消息将从DB中提取)。

现在真正的问题是:如果Foo的PID无效时间太长,即使在Bar重新连接并执行同步之后,他也会发送一些消息,那么该怎么办?Bar的消息将存储在数据库中,但由于它是在Bar进行同步之后存储的,因此不会传递消息。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-11 14:08:58

正如您所识别的--将PID作为用户标识符并不是一个好的解决方案,因为它本身就是短暂的。我认为更好的解决方案是用户Foo保存一些持久的用户ID,它将识别用户栏,不管他是否连接。

您可以使用ETS或DETS (支持持久性)保持从用户ID到PID的映射,并向当前注册到永久用户ID的PID发送消息。

票数 1
EN

Stack Overflow用户

发布于 2014-08-11 14:11:28

所以foo和bar应该互相监视。如果一个进程死亡,另一个进程将得到消息{'DOWN', Ref, process, Pid2, Reason}。正如Uri所说,您可以将一个进程专用于路由表的维护。

票数 0
EN

Stack Overflow用户

发布于 2014-08-12 09:40:08

您可以使用gproc库。它确实使用ETS注册、监视、发送消息和其他进程。您可以使用属性、唯一名称、甚至计数器注册进程,并使用ETS查询的强大功能对它们进行查询。API确实是完整的。

我认为,如果你想要一些保证交货,你需要自己做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25243655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档