compare with websocket and fastcgi protocol - noradle/noradle-dispatcher GitHub Wiki

noradle-dispatcher 的协议受到了 WebSocket/FastCGI 两个协议的启发。

differences between WebSocket and FastCGI

  • WebSocket protocol is for (massive) browser to server end-to-end communication
  • FastCGI is used for (http)server to (application)server end-to-end communication

共通点

  • client/server 点对点通信采用单TCP/stream链路,不会为各个请求单独创建连接
  • 基于 frame 的多路复用,通过 frame 中的 req id 或者 slot id 来区分并发的请求响应 frame
  • frame 分为应用类和管理类,id 分别为大于0,和等于0
  • 应用类别的frame: 一个请求或响应都是一个 frame 流,由 head,body/end/exception 等等不同类别的 frame 组成一个完成的请求和响应
  • 管理类别的frame:往往一个frame单独就是一个完整的请求或者响应,不用流
    • websocket: Opcode:4位操作码,包括 text/binary/ping/pong/close
    • noradle 已经引用 frame type,而且 slotID=0 代表管理包 ping/pong/quit
  • 管理frame有 ping/pong frame 机制,实现端到端 keep-alive 和心跳检测
  • 管理frame有 quit frame 机制,实现端到端的安全退出

遗弃点

但是 noradle-dispatcher 没有使用一些 websocket/fastcgi 的特性和机制,目的是为了简化设计,降低处理负载(而不是轻微的降低网络负载)。

  • 长度指示变长机制
    • websocket: payload length 不定长,noradle 是定长4个字节,对于单个 frame 2G/4G 足够用了。
    • fast-cgi : one byte or four bytes, see if the first byte is greater than 127
  • padding
    • fast-cgi : 每个 record 内容体都要 padding 到整数个 8 字节
  • frame 分片和组装
    • websocket: 大的 frame 分片,防止传输被一个请求独占,不过 noradle 已经将上传文件留下不发往db,因此意义不是很大