问题标签 [phoenix-channels]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3289 浏览

elixir - Elixir + Phoenix Channels 内存消耗

我对 Elixir 和 Phoenix 框架还很陌生,所以我的问题可能有点愚蠢。

我有一个应用程序,以 Elixir + Phoenix 框架作为后端,Angular 2 作为前端。我使用 Phoenix Channels 作为前端/后端交换的渠道。我发现了一个奇怪的情况:如果我从后端向前端发送大量数据,那么特定通道进程的内存消耗会高达数百 MB。并且每个连接(每个通道进程)都会占用如此多的内存,即使在传输结束之后也是如此。

这是后端频道描述的代码片段:

我创建了一个包含 60000 条记录的集合,只是为了测试前端处理如此大量数据的能力,但有一个副作用——我发现特定的通道进程内存消耗为 167 Mb。所以我打开了几个新的浏览器窗口,每个新频道进程的内存消耗在“播放列表:列表”请求之后增长到这个数量。

这是正常行为吗?我预计在数据库查询和数据卸载期间会消耗大量内存,但即使在请求完成后它仍然相同。

更新 1。因此,在@Dogbert 和@michalmuskala 的大力帮助下,我发现手动垃圾收集后内存将被释放。

我尝试使用 recon_ex 库进行一些挖掘,并找到了以下示例:

#PID<0.4410.6>是 Elixir.Phoenix.Channel.Server 并且#PID<0.4405.6>是 cowboy_protocol。

接下来我去了:

和:

最后是 recon.bin_leak 之后问题进程的状态(当然,实际上是在垃圾收集之后 - 如果我使用这些进程的 pid 运行 :erlang.garbage_collection() ,结果是相同的):

如果我不手动运行垃圾收集 - 内存“从不”(至少,我已经等了 16 个小时)变得空闲。

请记住:在从后端向前端发送一条消息并从 Postgres 获取 70 000 条记录后,我有这样的内存消耗。该模型非常简单:

记录是自动生成的,如下所示:

我真的很感激这里的任何建议。我相信我不会发送如此大量的数据,但即使是更小的数据集也可能在客户端连接很多的情况下导致巨大的内存消耗。而且由于我没有编写任何棘手的东西,因此这种情况可能隐藏了一些更普遍的问题(但这只是一个假设,当然)。

0 投票
1 回答
465 浏览

elixir - 通道有效负载的 Elixir/Phoenix 映射

好吧,我正在寻找一种将我从 db 检索到的多个元素(相同的列名)传递到通道有效负载的好方法。

例如:ppl = Repo.all(People)将返回两个带有id: 1, name: Mike,的结果id: 2, name: John。( name:column name) 用于 Mike 和 John,但是当通过通道有效负载时,我只能通过一个映射,其中不能同时具有两个名称:John,名称:Mike。

据我了解渠道,我们使用发送回客户端的地图(有效负载)。我计划根据从数据库中获得的信息动态生成 html。因此需要在一张地图/有效载荷中传递来自 People 的所有 ppl。

我目前的计划是制作类似于递归函数的东西,它将为 ppl 单独创建地图。%{name1: John}然后%{name2: Mike}使用Map.merge将它们和路径组合为一张地图。所以,我的问题是:有没有更好的方法来从有效载荷中的同一表(同一列)中路径多个元素?任何建议/建议表示赞赏!

谢谢!

0 投票
0 回答
914 浏览

websocket - Elixir/Phoenix websocket 错误

我正在尝试从 JS 应用程序连接到 Phoenix/Elixir 中的 websocket 连接,但是,现在无论我尝试什么,我得到了

错误:

从 Javascript 客户端,我通过以下方式连接:

以下是后端服务的源文件:

/lib/airtame_zap/endpoint.ex

/web/channels/zap_socket.ex

/web/channels/zap_channel.ex

有任何想法吗?我找到了这个回复Phoenix: Trying to connect to Channel but getting a not Route found for GET /websocket 错误,但没有帮助

0 投票
1 回答
273 浏览

elixir - 链接到错误:删除会话时 (PHOENIX)

我有一个链接可以删除当前用户的会话

出于某种原因,它不起作用,尽管当我将链接更改为按钮时,一切似乎都工作正常。

我很困惑,可能是导致此错误的原因。

有遇到同样问题的人吗?

0 投票
1 回答
28 浏览

phoenix-framework - 向通道添加自定义函数

我希望修改 Chris McCord 的聊天示例以添加其他功能。基本上,我希望 JavaScript 客户端能够使用 JSON 访问许多便利功能,例如getUsersInRoom(room_id)is_online(user_id)等。

但我不知道该怎么做。Channels 上的文档说:

每个 Channel 将实现这四个回调函数中的每一个的一个或多个子句 - join/3、terminate/2、handle_in/3 和 handle_out/3。

这是否意味着这些是唯一允许的功能?我认为我需要的是一个套接字 API,但我以前从未使用过套接字,希望能得到一些帮助。此外,该示例似乎适用于将字符串作为参数传递的直接函数调用,但我需要我的聊天系统才能使用 JSON。我完全不确定我该如何做到这一点。

0 投票
1 回答
219 浏览

phoenix-framework - Elm 应用程序停止接收凤凰频道广播

Elm、phoenix 和 elixir 对我来说很新,所以我想我会制作频道测试应用程序简单的示例应用程序来测试凤凰频道的使用。该应用程序还包含其他内容,因为它是由旧的“部件”制成的,但请耐心等待。

这个想法是你有几个 genservers 对 phoenix 端点进行 http 调用。基本上,他们只是在更新代理进程中保存的列表。该列表通过凤凰频道显示在 Elm 应用程序中。目标只是看看如果代理状态通过多个进程频繁更新会发生什么。

这就是我到目前为止所拥有的。我有一个带有 Elm 应用程序设置的凤凰网站和一个单独的 Elixir 应用程序,其中 genservers 进行更新。一切正常大约 20 秒,但随后通道连接被切断并且不会重新建立,除非我在浏览器上点击刷新。我可以从日志中看到后端仍然工作正常,并且浏览器控制台上也没有错误。那么这里的交易是什么?我认为通道连接如果丢失应该自动重新连接,为什么它仍然断开连接?

我猜问题出在elm-phoenix-socket上。这是在 elm 应用程序中设置的:

以下是在后端进行广播的方式:

所以本质上,genservers 不断地调用那个心跳端点。我怀疑问题出在这里。问题所在的另一种可能性是通道设置,如下所示:

user_socket.ex:

和 heartbeat_channel.ex:

那么任何想法是什么问题?我猜这真的很简单。

好的,我现在知道套接字传输超时了。但它为什么这样做呢?

0 投票
1 回答
740 浏览

redis - 通过 phoenix 通道从 redis 通道流式传输

我目前正在尝试用一个小的 phoenix 应用程序替换我需要做的是从通道获取信息并将其流式传输到客户端。我一直在尝试使用 Redis.PuSub 和 Phoenix Redis 适配器,但无法完全涵盖我们目前拥有的功能。

当前的功能是这样工作的:

我们的服务器接收来自用户的请求并将一些输出记录到 Redis 通道。该频道的名称是字符串和键的组合。然后 Ember 客户端使用相同的密钥向 action-cable 发出请求。然后 Action-cable 从 Redis 通道以相同的名称流式传输记录的信息。我需要知道的是,当用户发出请求并将该信息连续流式传输到客户端时,如何开始收听具有给定名称的 Redis 通道。我已经设法得到其中之一,但不是两者兼而有之。

一天多来,我一直在努力解决这个问题,因此非常感谢任何帮助。

干杯

0 投票
0 回答
386 浏览

elixir - 广播到所有活动频道 - Phoenix 框架 Elixir

简单的问题,是否可以从控制器向所有活动频道进行广播?

例如这里是我的控制器:

而且我有两个客户端仍然活跃在两个频道中,例如:room:1room:2。然后,当我调用blast操作时,这两个客户端将收到一些警报或推送通知。或者如果可以向所有频道广播可能会更好broadcast("*:*", "push_notifications", %{}),那么所有用户如果在不同的频道内,例如room并且discussions将收到推送通知。

提前致谢

0 投票
2 回答
1564 浏览

java - 用于 HBASE 的 JDBC Phoenix 驱动程序,重试 36 次并引发异常

我在服务器(远程)中安装了一个独立的 HBase。我编写了一个 Java 客户端,它使用 Phoenix 进行通信,并看到它尝试了 36 次尝试并因此引发异常。

连接字符串:

我在这里错过了什么吗,因为它根本没有连接。

例外:

有人可以帮我吗..!

0 投票
1 回答
294 浏览

elixir - 如何在 elixir phoenix 通道中访问 websocket 请求的完整 URL?

在我的凤凰频道中,我需要做一些需要我知道请求是针对哪个域的事情。示例:https://beta.example.comhttps://www.example.com。有没有办法从凤凰频道访问该信息或将该信息传递给凤凰频道?