精华内容
下载资源
问答
  • gnatsd 是一个使用 Go 语言开发的高性能 NATS 服务器。 配置: Server options: -a, --addr HOST Bind to HOST address (default: 0.0.0.0) -p, --port PORT Use PORT (default: 4222) -P, --pid FILE File ...
  • gnatsd集群原理分析

    2018-05-06 09:56:06
    看了一天gnatsd集群相关的源码差点没把我给绕晕,总算是搞个大体明白了,最近功力暴涨,哈哈哈。集群连接集群中的每个服务器之间都是互相通过route连接。 server1启动一个route进行tcp监听等待远程route连接。 ...

    看了一天gnatsd集群相关的源码差点没把我给绕晕,总算是搞个大体明白了,最近功力暴涨,哈哈哈。

    集群连接


    集群中的每个服务器之间都是互相通过route连接。
    server1启动一个route进行tcp监听等待远程route连接。
    收到server2的route client连接以后,server1调用sendInfo发送本服务器的一堆信息。
    server2也开启route server监听等待别的route连接,当server2 route client收到server1的info后转发给其他连接上来的route,其他route根据info也去连接server1。

    这样形成所有集群里的server全都互相连接在一起。

    sub订阅消息


    当一个server1收到user1 sub 时会先本地订阅,然后把sub消息广播给所有其他route。
    广播时重新定义了sid也就是subid。sid的值为:

    (Q)RSID::

    当sub是queue类型的主题时前缀是:QRSID,如果是普通sub则是RSID。
    cid是当前user client的id,sid是user1sid。

    当远程route收到此订阅消息时以route身份订阅此消息并且记录新的sid。此时route跟其他user client一样都在服务器的订阅者列表中。

    也就是说一个user在某个server上订阅了消息以后,集群中的所有服务器收到广播都会以route身份也订阅此消息。

    所以所有server都有完整的订阅列表,只不过订阅者一部分是正常本地登录的user client,另一部分是route。

    pub普通消息


    发送普通消息比较简单。
    user1.pub msg1 给server1时,server1把msg1转发给所有订阅者,其中有可能有route的订阅者。
    当route收到pub消息时,route把消息发给远程route。
    远程route收到消息后,遍历发送给其本地的user client订阅者。

    这样一条pub普通消息就发给了集群里的所有订阅者。

    pub queue消息


    当pub一条消息给订阅主题而这订阅主题属于queue时,只随机选择此queue中的一个订阅者发送消息,也就是一个queue消息最多只有一个消费者,而且是随机分配的。

    user1.pub msg1 给server1时,如果此subject1是个qsub,server1在本地qsubs中随机选择一个sub发送消息,选择的sub有可能是本地user client,此时发送消息完成就没事了。如果选择的sub刚好是个route的话,此时把消息发给远程route,而sid是此远程route订阅时指定的sid:(Q)RSID:cid:sid
    当远程route收到本地route转发的pub queue消息以后,先解析出cid和sid,检查cid对应的user client是否还存在,如果存在根据sid找到订阅者sub,然后给sub发消息,这样消息就递交到了最终的user client中。

    总结


    gnatsd集群其中一台server挂掉之后,只影响连接在此server上的用户,其他集群可以正常工作。
    集群开启后,随时可以开启一个新的server加入集群中的某一台server,新的server会自动连接到集群中所有其他server。

    说实话gnatsd集群这块代码写的真的挺难看的,全混在一起,看的人眼花缭乱晕头转向。

    展开全文
  • 开源项目-nats-io-gnatsd.zip,NATS服务器0.9.6输出
  • 暂时放弃nats - gnatsd

    2018-05-06 03:02:24
    都下决心用gnatsd了,最终放弃的原因是ios平台居然没有好的客户端。 官方推荐的swift客户端: travelish/Swift*Nats* 最后更新是2016年,而且代码太简陋了,很多功能都没实现。 另外一个开源raykrow/swifty-nats看...

    放弃的原因


    都下决心用gnatsd了,最终放弃的原因是ios平台居然没有好的客户端。
    官方推荐的swift客户端: travelish/Swift*Nats* 最后更新是2016年,而且代码太简陋了,很多功能都没实现。

    另外一个开源raykrow/swifty-nats看上去不错,可惜用了swifty-nio,不支持ios平台。

    自己写又实在是没时间没精力。算了,先暂时放弃gnatsd吧,毕竟没有持久化在未来也是头疼。
    还是用mosquitto先顶着吧。

    另外吐槽一下这个名字gnatsd,真是非常拗口,隔壁兄弟nsq多顺口好记而且还简短,你再不济叫个gonats也好啊。

    gnatsd代码学习


    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。

    展开全文
  • gnatsd server 结构解析

    2015-07-25 00:48:42
    花了几天时间通读了一遍gnatsd,在此做下笔记。 来源cloudfoundry,是一个开源轻量高性能的消息系统,gorouter依赖它来作为消息系统,进行PUB/SUB操作。 官方地址:http://nats.io/ 项目地址:...

    花了几天时间通读了一遍gnatsd,在此做下笔记。

    来源cloudfoundry,是一个开源轻量高性能的消息系统,gorouter依赖它来作为消息系统,进行PUB/SUB操作。
    官方地址:http://nats.io/
    项目地址:https://github.com/apcera/gnatsd

    gnatsd的代码结构如下:
    图片描述

    基本上,结构只需要看gnatsd.go和 server/ 这两个文件(路径)就可以了。
    晒下做的思维导图,基本上gnatsd结构还是挺明白的。
    图片描述

    展开全文
  • 稍微看了一下gnatsd的源码,应该这样改就可以: 首先要自定义鉴权系统,每个用户都需要使用不同的用户名进行鉴权登录。 修改server.users新增一个clientid字段,记录登录成功的用户id,当然要记得写入时上server...

    golang就是爽,代码简单易懂。稍微看了一下gnatsd的源码,应该这样改就可以:


    1. 首先要自定义鉴权系统,每个用户都需要使用不同的用户名进行鉴权登录。
    2. 修改server.users新增一个clientid字段,记录登录成功的用户id,当然要记得写入时上server的锁。
    3. client增加一个kicked变量做为标志。
    4. 鉴权成功在server.users中查看是否已经有clientid,如果有则在server.cliens中查找client,找到client设置此client的kicked标志,并更新server.users的clientid为当前clientid。
    5. 在client.readloop中的read下面检测client.kicked标志,如果标志被设置则给客户端发出一个被重入的消息,然后closeconnection。
    6. 使用server里的锁保护server.users.client字段,可以保证原子性。
    7. 客户端收到被重入的错误消息以后,需要在界面上做出响应。

    自定义鉴权系统的问题


    自定义鉴权系统打算使用外部数据库Redis保存user和pwd。
    每次都去Redis中查询进行鉴权。
    此时本地的server.users列表就不用来鉴权,只用来保存当前登录user对应的clientid。
    本地配置文件还有可能被reload,这样users列表会被覆盖,考虑不使用原本的users列表再新增定义一个userclientids列表。

    集群时的问题


    当使用集群时,同一个帐号可能登录在不同实例上,以上修改只能踢出当前登陆实例上的老Client,而在其他实例上还是保持着连接。
    所以还需要给所有其他集群广播一条kickuser的消息。

    展开全文
  • 因为对mqtt服务器mosquitto的源码简单研究感觉其性能在多处都有瓶颈比如网络层没有使用epoll,topic使用树(在大量topic时岂不是要遍历到死)还有很多……,所以又去网上搜索其他消息系统的资料,然后发现gnatsd的...
  • 主题名(Subject Name) 主题名是大小写敏感的,必须是非空字符串,不能包含空格,使用“.”符号来分层,mqtt中使用“/”分层。 星号“*”匹配一层,跟mqtt中的“+”一样。 大于号“>...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 346
精华内容 138
关键字:

gnatsd