过去,我实施了多租户系统,并使用请求主机标头在租户之间隔离用户。我的第一个想法是采用相同的方法,但使用websockets但我遇到了几个问题:
1)主机标头似乎不可用
2)主题ID与渠道之间存在一对一的关系,即如果两个不同的客户从不同的租户连接到同一主题(例如messages:lobby
),那么他们将收到任何针对其他租户的消息
我已经能够通过在websocket连接字符串中包含一个标识租户的查询参数来解决(1)。 (2)事情有点不清楚。我可以命名主题以包括租户的标识符,例如tenant1:messages:123
,但主题中现在有两个变量,因此您无法匹配tenant_id <> ":messages:" <> message_id
之类的函数。您可以使用单个函数解决此问题,但是有很多样板文件正在进行中。
多租户网页套件是否有更好的策略?
答案 0 :(得分:3)
抱歉写这个作为答案而不是评论,但我还没有50个声誉。
为什么不让主题看起来像messages:tenant1:123
?
你可以在一个函数上进行模式匹配,然后只需将它们分开并将它们传递给实际使用它们的函数:
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