如何向网络套接字回调模块的handle_message
回调功能发送消息,以便从其他网络套接字更新其InternalState
回调模块??
答案 0 :(得分:3)
如果您希望Yaws websocket回调进程了解其他此类进程,您必须自己创建某种注册表。 Yaws websocket进程未注册,因为Yaws不需要找到它们;每个都与一个套接字相关联,并且各自套接字上的活动就是他们的消息到达它们的方式。
实现这样一个注册表的一种方法是使websocket回调模块初始化函数调用erlang:register/2
,但是这种方法会遇到每个回调过程需要一个新的原子名称的问题,以及你的服务器是否运行足够长的时间,你将耗尽原子并使Erlang VM崩溃。
更好的方法是创建一个管理gen_server
表的ets
注册表进程,然后让websocket回调模块init函数向该进程注册,然后将该详细信息存储到ets
表。回调过程可以通过直接访问ets
表(假设它允许公共读取),或者通过在注册表进程上调用查询函数来找到另一个,但请注意,在后一种情况下,如果此类调用是频繁的,有很多websocket进程,注册表可能是一个瓶颈。
第二种方法允许您使用除原子之外的其他键,例如字符串,整数或二进制,因此它不会遇到原子耗尽的问题。另一个好处是注册表进程可以监视每个已注册的websocket回调进程,并在它们死亡时从注册表中删除它们。
如果你没有在嵌入模式下使用Yaws,你可以使用yapps
feature of Yaws启动你自己的应用程序,与Yaws共同运行,启动一个主管,然后启动并管理注册表进程。在这种情况下,没有必要像文档建议的那样在每个虚拟服务器上注册yapp,因为yapp本身不会处理Yaws请求。
答案 1 :(得分:0)
我有类似的方法。如果您有多个Yaws服务器来处理websocket,您可以将websocket Pid存储到mnesia,并使用Pid ! Message
将消息发送到特定的websocket Pid,最后将调用websocket回调模块handle_info/2
。