1

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

1)主机头似乎不可用

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

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

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

4

1 回答 1

3

很抱歉将其写为答案而不是评论,但我还没有 50 名声望。

而不是在tenant_id前面,为什么不让主题看起来像这样messages:tenant1:123

您可以对函数进行模式匹配,然后只需拆分 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
于 2016-10-25T20:29:27.963 回答