计算 Phoenix 应用程序中打开的套接字和通道连接数

Posted

技术标签:

【中文标题】计算 Phoenix 应用程序中打开的套接字和通道连接数【英文标题】:Count open socket and channel connections in a Phoenix application 【发布时间】:2019-04-24 18:25:32 【问题描述】:

Phoenix 应用程序中是否有一种相对简单的记录方式来读取在任何给定时间当前打开的活动套接字和通道的数量?更具体地说,是否可以按主题和其他频道连接元数据过滤这些数据?

我的用例是分析与我的后端的活动连接。

感谢您的任何建议!

【问题讨论】:

【参考方案1】:

您正在寻找Phoenix.Presence。来自文档:

为流程和渠道提供状态跟踪。

此行为提供了在线状态功能,例如获取给定主题的在线状态,以及实时处理加入和离开事件的差异。使用这个模块定义了一个监督者,并允许调用模块实现Phoenix.Tracker行为,该行为启动一个跟踪器进程来处理存在信息。

基本上,您应该根据您的需要实现Phoenix.Presence 行为(文档中几乎可以使用的示例)和Phoenix.Tracker

【讨论】:

谢谢,我已经阅读了Presence 文档,它似乎是用于跟踪按主题的存在。但是,如果我有属于同一类别的各种不同主题(例如 user:1user:2),是否可以跟踪 user 类别的存在?我在文档中没有看到任何表明这一点的内容。 您将根据需要实现自己的逻辑跟踪。 我能够通过创建一个指定的main 频道来解决这个问题,除了连接到他们自己的用户频道(例如user:23)之外,所有用户都连接到该频道。然后,我在main 频道中截获了诸如presence_diff 之类的事件,并将更新仅发送给管理员,因为普通用户不应该能够看到其他用户的存在信息,至少在我的应用程序中涉及分析。我仍然觉得这个解决方案是一种解决方法,并且有更好的解决方案可用,但我无法找到任何类似事情的记录示例。 @Murcielago 看看我的仓库,虽然这是我第一次尝试实现跟踪器github.com/denvaar/mmo_server/blob/master/lib/… Phoenix 将套接字信息存储在ets 中。有一篇很棒的文章关于阅读该信息 neuvians.io/2016/02/27/… 代码很短:` def count do acc = fn channel, _, map -> Map.update(map, channel, 1, &(&1 + 1) ) 结束 :ets.foldl(acc, %, MyGreatApp.PubSub.Local0) 结束 `

以上是关于计算 Phoenix 应用程序中打开的套接字和通道连接数的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Phoenix 控制器向 Channel 广播消息?

在 Redux 中存储 websocket(通道)连接对象

Java NIO之通道

Java NIO之通道

socket

java.nio.channels的通道定义