过去,我实现了多租户系统,并使用请求主机标头在租户之间隔离用户。我的第一个想法是采取相同的方法,但与websockets,但我遇到了几个问题:
1)主机头似乎不可用
2)主题id和通道之间存在一对一的关系,即如果两个不同的客户端从不同的租户连接到相同的主题(例如messages:lobby
),那么它们将接收任何用于其他租户的消息。
我已经能够通过在websocket连接字符串中包含一个识别租户的查询参数来解决(1)。(2)是事情有点不清楚的地方。我可以命名主题,包括租户的标识符,例如tenant1:messages:123
,但现在有两个变量的主题,所以你不能匹配功能,如tenant_id <> ":messages:" <> message_id
。你可以用一个函数来解决这个问题,但是会有很多样板文件。
对于多租户websockets是否有更好的策略?
很抱歉写这篇文章作为回答而不是评论,但我还没有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