dispatcher function - noradle/noradle-dispatcher GitHub Wiki

dispatcher 要起到的作用

  1. 拆分原有通讯协议,新设计的 frame protocol作为下层通用服务协议,将原有的通信语义全部改造成基于 frame protocol,从而使通讯协议设计更加清晰简洁
  2. 长期稳定的持有来自 oracle database 的反向连接(o2n本质上存在缺陷,对异常的检测缺失和不及时)
  3. 安全的重启 oracle 后台服务进程(手工重启,最大处理量和最大生命期时自动重启进程)
  4. 允许客户端正向连接,即时连接
  5. 客户端多个并发请求复用单个socket,提升响应和效率
  6. 客户端无需管理连接池,使用dispatcher提供的虚拟连接池,极简的连库代码
  7. 通过心跳可以发现客户端异常(网络异常或者客户端退出)
  8. 连接集中器,方便集中监控和管理
  9. 静态和动态分配 db access path给各个客户端,进行资源的合理分配
  10. 充分利用数据库处理能力,既不用担心有处理资源没有充分利用,也不用担心请求过载压垮服务器
  11. 允许client/dispatcher之间通过任何通道通信,包括直接的TCP/UNIX socket,也可以是 connection over anything(http, https, ssh ...)
  12. 考虑在client/dispatcher间gzip压缩frame,降低网络开销
  13. 考虑实现 pipelined request/response stream 来进一步降低资源空置率并提高响应速度

dispatcher 和其他服务端介入技术比较后突出的特点:

性能方面:低网络开销网络延迟、 资源分配和利用方面:动态智能的高资源利用率、 API和开发的简单性:简单但可以支持各种常见协议的接入、 运行可靠性和可维护可管理性:可集中动态监控、健壮鲁棒的。 dispatcher 设计原则

  1. 只包含简单的处理逻辑,并且长期稳定不变

  2. 只负责 multiplex 单个到 client 的 socket 到不同的 oracle socket,而不管其中的内容

  3. 但是缓存每个请求流的头部,直到该请求处理完,用于监控使用

  4. 可以手动和根据预定策略动态的调整各个客户端的并发度 dispatcher 对请求结构、请求协议多少要有一些了解, 这样才能方便进行监控,包括:

  5. 一个 frame 是否是一个请求 header,用于判断是否有新请求到达,进行计数,每个请求的处理时间计算,监控界面用来显示该请求的相关信息,特别是其中的 x$dbu.x$prog 信息。

  6. 一个请求和一个回复是否数据都传输完毕,同样也是用于状态监控和计数。因此每次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 ...