2016-10-25 165 views
1

在過去,我已經實現了多租戶系統,並使用請求主機頭將用戶隔離在租戶之間。我首先想到的是要採取同樣的方法,但使用WebSockets,但我打了幾個問題:多租戶鳳凰頻道

1)主機頭不會出現可用

2)有一個話題之間的一對一的關係id和頻道,即如果兩個不同的客戶端連接到不同的租戶,但連接到相同的主題(例如messages:lobby),那麼他們將收到任何意味着其他租戶的消息。

我已經能夠通過在websocket連接字符串中包含標識租戶的查詢參數來解決(1)。 (2)事情有點不清楚。我可以爲主題命名空間以包含租戶的標識符,例如tenant1:messages:123,但是在主題中現在有兩個變量,因此無法匹配tenant_id <> ":messages:" <> message_id之類的函數。你可以用一個函數來解決這個問題,但是有很多樣板文件正在進行。

對於多租戶websockets有更好的策略嗎?

回答

3

抱歉,爲了寫這個答案而不是評論,但我沒有50的聲望呢。

而不是preant 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 
+0

這絕對是一個很好的點。除了函數匹配之外,'Socket.channel'宏只能匹配'channel'消息形式的模式:*「'而不是'channel」*:messages:*「'.' – opsb