Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Websocket 多租户凤凰频道_Websocket_Elixir_Phoenix Framework_Phoenix Channels - Fatal编程技术网

Websocket 多租户凤凰频道

Websocket 多租户凤凰频道,websocket,elixir,phoenix-framework,phoenix-channels,Websocket,Elixir,Phoenix Framework,Phoenix Channels,在过去,我实现了多租户系统,并使用请求主机头在租户之间隔离用户。我的第一个想法是采用相同的方法,但使用WebSocket时,我遇到了几个问题: 1) 主机标题似乎不可用 2) 主题id和频道之间存在一对一的关系,即,如果两个不同的客户端从不同的租户连接到同一主题(例如消息:lobb),则它们将接收任何针对其他租户的消息 我已经能够通过在websocket连接字符串中包含一个标识租户的查询参数来解析(1)。(2) 事情有点不清楚。我可以将主题命名为包含租户标识符的名称空间,例如tenant1:me

在过去,我实现了多租户系统,并使用请求主机头在租户之间隔离用户。我的第一个想法是采用相同的方法,但使用WebSocket时,我遇到了几个问题:

1) 主机标题似乎不可用

2) 主题id和频道之间存在一对一的关系,即,如果两个不同的客户端从不同的租户连接到同一主题(例如
消息:lobb
),则它们将接收任何针对其他租户的消息

我已经能够通过在websocket连接字符串中包含一个标识租户的查询参数来解析(1)。(2) 事情有点不清楚。我可以将主题命名为包含租户标识符的名称空间,例如
tenant1:messages:123
,但是主题中现在有两个变量,因此无法匹配
tenant\u id:messages:messages\u id
之类的函数。你可以用一个函数来解决这个问题,但是有很多样板正在进行


多租户WebSocket是否有更好的策略?

很抱歉将此作为回答而不是评论,但我还没有50%的声誉

为什么不让主题看起来像
messages:tenant1:123
,而不是在租户id前面加上前缀

您可以在函数上进行模式匹配,然后拆分ID并将其传递给实际使用它们的函数:

    def foo("messages:" <> ids) do
      [tenant_id, message_id] = String.split(ids, ":")
      bar(tenant_id, message_id)
    end

    def bar(tenant_id, message_id) do
      # Do something
    end
def foo(“消息:”id)do
[租户id,消息id]=String.split(id,“:”)
条(租户id、消息id)
结束
def bar(租户id、消息id)do
#做点什么
结束

这绝对是一个好观点。除了与
Socket.channel
匹配的函数外,宏只能匹配形式为
channel“messages:*”
的模式,而不是
channel“*:messages:*”
`