多租户凤凰频道

时间:2016-10-25 17:06:09

标签: websocket elixir phoenix-framework phoenix-channels

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

1)主机标头似乎不可用

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

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

多租户网页套件是否有更好的策略?

1 个答案:

答案 0 :(得分:3)

抱歉写这个作为答案而不是评论,但我还没有50个声誉。

为什么不让主题看起来像messages:tenant1:123

,而不是在tenant_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