我这里分析的是由nats streaming启动nats的,不连接外部nats
1.在nats streaming第一章,已经说明nats streaming会启动客户端连接nats,然后注册消息回调,包括客户端连接,订阅,发布等消息回调
2.订阅客户端发送订阅消息,服务端调用readLoop()进行消息读取,c.parse消息解析,processMsg(解析出事件,这里是解析出发布事件,消息转发到nats streaming)
for循环调用订阅事件监听者,
3.上面都还算是nats服务器调用,接着消息转发到nats streaming,readLoop->(nc *Conn) processMsgArgs(在这里确定事件的调用者,这里认为有个设计不好的地方,事件调用者确认是通过nc.ps.ma.sid,而这个值是按依赖于初始化自增的,个人认为固定事件id更好,而不是依赖于初始化顺序,在这里发布事件的sid是3)->(nc *Conn) processMsg(把消息丢入sub.pHead队列)->(nc *Conn) waitForMsgs(循环取出队列消息进行处理,调用mcb(m)进行事件注册回调)->(s *StanServer) processClientPublish(这里不同于定位,经过一些合法性校验后把消息体丢入通道s.ioChannel处理),此次发布就算结束了。
4.通道监听函数(s *StanServer) startIOLoop()处理发布,storeIOPendingMsgs持久化存储,(s *StanServer) processMsg(消息处理)