都下决心用gnatsd了,最终放弃的原因是ios平台居然没有好的客户端。
官方推荐的swift客户端: travelish/Swift*Nats* 最后更新是2016年,而且代码太简陋了,很多功能都没实现。
另外一个开源raykrow/swifty-nats看上去不错,可惜用了swifty-nio,不支持ios平台。
自己写又实在是没时间没精力。算了,先暂时放弃gnatsd吧,毕竟没有持久化在未来也是头疼。
还是用mosquitto先顶着吧。
另外吐槽一下这个名字gnatsd,真是非常拗口,隔壁兄弟nsq多顺口好记而且还简短,你再不济叫个gonats也好啊。
gnatsd做为golang写的项目,代码质量还是很不错的,不像大多数golang程序大量泛滥的使用chan,而是尽量减少锁的使用,在必须使用锁的地方使用Atom、RWMutex和Mutex。这样性能比nsq强上一截(当然没有持久化也是速度快的很大原因)。
因为原本像上一篇文章所写的想修改gnatsd,所以粗粗看了一点代码,大的架构如下:
在唯一的主Server类中Listen tcp端口,Accept客户端连接以后开新goroutine运行Client的readLoop循环读取数据,解析命令以后就在此goroutine执行逻辑。比如收到pub消息,调用processMsg遍历所有sub把消息使用deliverMsg发出去。
在Read的这个goutinue也调用了别的sub的Write,在遍历sub时使用了Mutex锁。
所以Client的Read和Write没有特意开启两个goroutine分离,而是Read之后需要回复自己就在同一个goroutine里Write,另外如果Client sub了消息则Write还在别的Client的Read goroutine里被动调用,使用锁保护。
也就是说一个Client只占用一个goroutine。