lotou详解二:service注册和单节点消息发送

代码地址

lotou中通过core/handler.go来管理单机节点中注册的service

注册和移除注册

registerService为一个service分配一个唯一的serviceId
serviceId由16的节点id和46位的本机唯一的id组成。

unregisterService移除一个service,同时将serviceId写会cache。

这里为了避免服务器长时间运行,频繁增删service导致serviceID耗尽,对serviceId进行了缓存,如果有缓存的serviceId,在注册service的时候会优先被使用。

消息发送

lotou中消息主要有以下几种:
1. 普通的消息发送
2. request 异步非阻塞请求模式,发送request同时注册一个回调函数,当响应service调用respond之后,回调函数会被触发。
3. call 阻塞同步请求,当响应service调用ret之后,call会返回。

消息分发

每个service都有一个msgChan, 用于缓存接收到的message。
service启动的时候会开启一个goroutinue,并且goroutinue中不断地从msgChan中取出message进行消息分发,service的用户逻辑根据message的Cmd进行响应的逻辑处理,并根据不同的消息类型进行对应的回复操作。

normal

normal消息可以理解成一种普通的通知类消息,不需要响应service进行回应
普通的消息直接通过msg.go的sendNoEnc或者send进行发送
1. 通过目的serviceId找到对应的service
2. 生成消息message
3. 向目的service的msgChan写入message
4. 目的service的主goroutinue从msgChan获取到message,分发处理
5. 一个normal message的生命周期完成

request

request有超时参数和回调函数,一个request消息的处理流程如下:
1. 发送service为一个request生成一个唯一的requestId,同时将requestId和回调函数对应缓存,并启动一个定时器在超时的时候可以发送一个超时消息给发送service。
2. 通过目的serviceId找到对应的service
3. 生成消息message
4. 向目的service的msgChan写入message
5. 目的service的主goroutinue从msgChan中获取到message,分发处理
6. 目的service处理完成之后,向发送service发送一个respond消息
7. 向发送service写入respond message
8. 发送service的主goroutinue从msgChan中取得respond message,根据respond中的requestId找到回调函数,并调用,
9. request完成。
如果上述过程中目的service没有收到request消息或者响应超时,则第一步中启动定时器会向发送service发送一个timeout消息,发送service根据超时消息中的request,调用request的回调函数,并告知已超时。

call

call 目前设置的是一个全局超时时间,call的流程如下:
1. 发送service发起一个call 消息,同时生成一个唯一的callid和一个channel,并缓存在中
2. 找到目的service并向其msgChan写入一个call message
3. 发送service从第一步的channel读取消息,阻塞
4. 目的service的主goroutinue从msgChan中取得call message,分发处理
5. 目的service处理完成之后,根据发送serviceId找到发送service,并根据callid从发送service中找到对应的channel,想channel写入返回值。
6. 当channel中有值之后,发送service可以从channel阻塞中返回,并取得返回值,然后返回。
7. call调用完成。
注意:因为call会导致goroutinue阻塞,所以不建议在service的主goroutinue中调用,应该启动一个新的goroutinue然后调用call函数,避免阻塞service的后续消息处理。

单节点的消息处理就主要是包括以上部分,下一章将继续介绍lotou实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值