因為對mqtt服務(wù)器mosquitto的源碼簡單研究感覺其性能在多處都有瓶頸比如網(wǎng)絡(luò)層沒有使用epoll养匈,topic使用樹(在大量topic時豈不是要遍歷到死)還有很多......碗旅,所以又去網(wǎng)上搜索其他消息系統(tǒng)的資料咒吐,然后發(fā)現(xiàn)gnatsd的性能很牛逼,雖然功能上比mqtt弱拄丰,但是在某種程度上可能也可以契合我的項目挤安。
首先我想了解一下gnatsd的鑒權(quán)系統(tǒng)捅暴,一開始發(fā)現(xiàn)都是寫在配置文件里,這樣對于少量的用戶是可以的或者大量用戶時共享密碼和權(quán)限帚称,但是如果想對所有用戶都使用不同的密碼和權(quán)限控制就不行了官研。
自定義鑒權(quán)解決方案
還沒開始正式使用,都沒下載代碼只是簡單在github上查看了一下代碼最終發(fā)現(xiàn)一個解決方案:
server/auth.go:
// Authentication is an interface for implementing authentication
type Authentication interface {
// Check if a client is authorized to connect
Check(c ClientAuthentication) bool
}
server/auth.go:
if s.opts.CustomRouterAuthentication != nil {
return s.opts.CustomRouterAuthentication.Check(c)
}
server/opts.go:
CustomClientAuthentication Authentication `json:"-"`
在auto.go
中進行鑒權(quán)闯睹,每次都先判斷如果CustomRouterAuthentication
不為空則執(zhí)行CustomRouterAuthentication.Check
進行鑒權(quán)戏羽。
CustomRouterAuthentication
實現(xiàn)Authentication
接口的Check
方法。
所以在server初始化時楼吃,傳入一個自定義的CustomClientAuthentication
即可始花,例如:
opts := DefaultOptions()
opts.CustomClientAuthentication = &clientAuth
s := RunServer(opts)
自定義的鑒權(quán)類可以模仿mosquitto auth plugin插件使用查詢數(shù)據(jù)庫進行鑒權(quán),比如查Redis孩锡。
附Issues中關(guān)于鑒權(quán)的討論:
Enable external Authentication (authn) and Authorization (authz) via Extensible Auth Provider. #434