dispatcher function - noradle/noradle-dispatcher GitHub Wiki
dispatcher 要起到的作用
- 拆分原有通讯协议,新设计的 frame protocol作为下层通用服务协议,将原有的通信语义全部改造成基于 frame protocol,从而使通讯协议设计更加清晰简洁
- 长期稳定的持有来自 oracle database 的反向连接(o2n本质上存在缺陷,对异常的检测缺失和不及时)
- 安全的重启 oracle 后台服务进程(手工重启,最大处理量和最大生命期时自动重启进程)
- 允许客户端正向连接,即时连接
- 客户端多个并发请求复用单个socket,提升响应和效率
- 客户端无需管理连接池,使用dispatcher提供的虚拟连接池,极简的连库代码
- 通过心跳可以发现客户端异常(网络异常或者客户端退出)
- 连接集中器,方便集中监控和管理
- 静态和动态分配 db access path给各个客户端,进行资源的合理分配
- 充分利用数据库处理能力,既不用担心有处理资源没有充分利用,也不用担心请求过载压垮服务器
- 允许client/dispatcher之间通过任何通道通信,包括直接的TCP/UNIX socket,也可以是 connection over anything(http, https, ssh ...)
- 考虑在client/dispatcher间gzip压缩frame,降低网络开销
- 考虑实现 pipelined request/response stream 来进一步降低资源空置率并提高响应速度
dispatcher 和其他服务端介入技术比较后突出的特点:
性能方面:低网络开销网络延迟、 资源分配和利用方面:动态智能的高资源利用率、 API和开发的简单性:简单但可以支持各种常见协议的接入、 运行可靠性和可维护可管理性:可集中动态监控、健壮鲁棒的。 dispatcher 设计原则
-
只包含简单的处理逻辑,并且长期稳定不变
-
只负责 multiplex 单个到 client 的 socket 到不同的 oracle socket,而不管其中的内容
-
但是缓存每个请求流的头部,直到该请求处理完,用于监控使用
-
可以手动和根据预定策略动态的调整各个客户端的并发度 dispatcher 对请求结构、请求协议多少要有一些了解, 这样才能方便进行监控,包括:
-
一个 frame 是否是一个请求 header,用于判断是否有新请求到达,进行计数,每个请求的处理时间计算,监控界面用来显示该请求的相关信息,特别是其中的 x$dbu.x$prog 信息。
-
一个请求和一个回复是否数据都传输完毕,同样也是用于状态监控和计数。因此每次oracle侧write content body buffer 时,都应该增加长度指示在最前面,并且在结束时,附带上值为0的长度指示。这样就知道 request/response 结束了。
frame 头结构,总共64位。
-
slotID uint16,其中可能高位代表各个 flag,如 gzip 压缩等等
-
type uint8 对于 request,正值代表 multipart 的各个部分,-1 代表唯一那个 request body,-2和往后代表各个上传附件 对于 response 负值为系统定义head,body,css,正值为各个layout用到的component片段
-
flags unit8 预留 (包括压缩标志等等,及时清理slot等等)
-
length uint32 内容的长度(负值代表流开始和全部头部信息,正值代表内容片断,零代表流结束)
-
type=0, len>0 代表是 request/response 的开始
-
type=0, len=0 代表是 request/response 的结束
-
type=1代表唯一的body
-
type=2...n 代表 request/response multipart 的各个部分
-
type=-n 代表系统内置的特殊的片段,如 css/js 引用等等
实现的考虑
- multi-plex
- inter-stream 切分,各个请求的边界切分,跨三方
- inner-stream 切分,各个请求的边界切分,跨三方;dispatcher 不知道中间的组合方式
- server-process(SP) 的分配策略和调整策略
- dispatcher 如何能够获取各方的等待队列长度
- 各个进程的安全退出,cluster 模式的支持
- 防止错误的oracle instance连接到dispatcher
- 动态视图支持
- 能够承载各种协议,包括NDBC,HTTP,HTTP2,fast-cgi, SPDY,ftp, mail 等等
监控统计信息
- 查看每个 slot 当前对应的 sid,serial#,请求数,启动时间,生命期,最近连接时间
- 查看当前 slot 状态,是 idle,还是 active,最后一次或者当前的请求的 header 和请求过程,来访的客户端
- 为每个客户端收集统计数据,最早和最近一次开始连接时间,处理量,总用时,平均用时等等
- 每个客户端的当前 queue request 数量,active request 数量,并发资源数。
组件划分
1、framework 相当于原来的 gateway,作为服务端的总框架 2、bios 获取输入,支持输出,但都是最最基本的,不带有高级特征
然后其他功能基于 framework/bios 之上设计开发,包括
json/xml/soap/rest service,mongoose-like API ...