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