websocket开发技巧

2020/09/03 RTM 共 1549 字,约 5 分钟

websocket开发技巧

  • 通过http握手,然后upgrade升级为websocket长连接;

  • 一般通过nginx ssl代理,将ws升级为wss;

    ** 架构简单时,采用nginx upstream;

    ** 如果系统容量大时,可将后端服注册到微服务中心,nginx去拉取ip+port列表。非常灵活方便。

websocket协议字段

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-------+-+-------------+-------------------------------+
     |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
     |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
     |N|V|V|V|       |S|             |   (if payload len==126/127)   |
     | |1|2|3|       |K|             |                               |
     +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
     |     Extended payload length continued, if payload len == 127  |
     + - - - - - - - - - - - - - - - +-------------------------------+
     |                               |Masking-key, if MASK set to 1  |
     +-------------------------------+-------------------------------+
     | Masking-key (continued)       |          Payload Data         |
     +-------------------------------- - - - - - - - - - - - - - - - +
     :                     Payload Data continued ...                :
     + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
     |                     Payload Data continued ...                |
     +---------------------------------------------------------------+
  • websocket实质是私有协议,只是被统一为了标准协议

  • 应用协议采用FIN字段进行分片;—— 开发后端时,重点注意对这个字段的处理;

websocket开发场景

  • IM/chatroom即时聊天系统;

  • websocket在webrtc做控制信令;

  • 新的长连接协议一般采用websocket,特别是在IM聊天系统中;

    ** 开发成本低:不需要维护TCP长连接sdk;在websocket API基础上开发应用层协议。

    ** 互通成本低:移动端、web端、小程序端均采用websocket长连接。

    ** websocket API接口简单。

  • wss-flv websocket传输媒体协议flv;

websocket开发的关键

  • 【重点】链接状态管理机制;(disconnect, conencting, connected等状态跃迁)

  • 面向对象的方法管理房间(群); —— 千万不要采用结构化的方式设计;

  • login API登录超时机制优化;—— 在socket通道还没ready时,应该做login请求先缓存;

  • login/logout、join/leave关键API的采用互斥锁进行串行约束;(后面博客会分享);

  • 小心setTimeout/setInterval使用的各种坑;

  • token管理机制; —— 优化设计时要多研究分布式实时系统的定时同步机制

  • 应用层协议设计:不要太复杂。最好可采用json或protobuf。

【注】如果是自定义序列化、反序列化,而没有对应的成熟序列化工具,需要手写序列化、反序列; —— 开发效率非常低;所以尽量采用通用简单的序列化方式。

参考链接

  • https://tools.ietf.org/html/rfc6455

文档信息

Search

    Table of Contents