因为对mqtt服务器mosquitto的源码简单研究感觉其性能在多处都有瓶颈比如网络层没有使用epoll,topic使用树(在大量topic时岂不是要遍历到死)还有很多……,所以又去网上搜索其他消息系统的资料,然后发现gnatsd的性能很牛逼,虽然功能上比mqtt弱,但是在某种程度上可能也可以契合我的项目。
首先我想了解一下gnatsd的鉴权系统,一开始发现都是写在配置文件里,这样对于少量的用户是可以的或者大量用户时共享密码和权限,但是如果想对所有用户都使用不同的密码和权限控制就不行了。
还没开始正式使用,都没下载代码只是简单在github上查看了一下代码最终发现一个解决方案:
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
中进行鉴权,每次都先判断如果CustomRouterAuthentication
不为空则执行CustomRouterAuthentication.Check
进行鉴权。
CustomRouterAuthentication
实现Authentication
接口的Check
方法。
所以在server初始化时,传入一个自定义的CustomClientAuthentication
即可,例如:
opts := DefaultOptions()
opts.CustomClientAuthentication = &clientAuth
s := RunServer(opts)
自定义的鉴权类可以模仿mosquitto auth plugin插件使用查询数据库进行鉴权,比如查Redis。
附Issues中关于鉴权的讨论:
Enable external Authentication (authn) and Authorization (authz) via Extensible Auth Provider. #434