【问题标题】:Multi tenant phoenix channels多租户凤凰频道
【发布时间】:2017-03-07 20:15:43
【问题描述】:

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

1) 主机标头似乎不可用

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

我已经能够通过在 websocket 连接字符串中包含一个标识租户的查询参数来解决 (1)。 (2)是事情有点不清楚的地方。我可以命名主题以包含租户的标识符,例如tenant1:messages:123,但现在主题中有两个变量,因此您无法匹配 tenant_id <> ":messages:" <> message_id 之类的函数。你可以用一个函数来解决这个问题,但是有很多样板文件。

对于多租户 websocket 有更好的策略吗?

【问题讨论】:

    标签: websocket elixir phoenix-framework phoenix-channels


    【解决方案1】:

    很抱歉将其写为答案而不是评论,但我还没有 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
    

    【讨论】:

    • 这绝对是个好点。除了与Socket.channel 宏匹配的函数外,它只能匹配channel "messages:*" 形式的模式,而不是channel "*:messages:*"。`
    猜你喜欢
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    相关资源
    最近更新 更多