短连接配对方案

方案背景

目前各个行业都开始向在线化迁移,在网络时代2C场景较多使用web网页进行交互。在企业网站发展过程中经常会遇到需要配对的需求场景,我将在这篇文章中结合实际经验对web端配对方案进行总结。

方案演进

配对功能细节根据不同的业务场景,复杂的也有一定差异,我们根据业务场景的不断演进来牵引出配对能力的演进步骤。

双方用户配对

双方用户配对属于最简单的配对模型,其目的在于实现任意双方用户进行配对。其流程如下:
undefined

如何配对
  1. 用户发起一条配对请求, 如果没有配对成功需要轮训多次调用。(见1.1)
  2. 查询当前用户是否存在有效的配对数据,如果有则延用原有配对信息,否则插入新的记录。(见1.2和1.3)
  3. 如果是新插入记录, 将配对ID加入匹配队列,直接进行逻辑 4。如果已有配对记录,配对状态为“配对成功”则刷新心跳状态后直接返回配对信息,请求结束;如果状态为“等待”则进行第4步。(见1.4)
  4. 配对队列中pop一个配对ID,原子性检查并修改双方配对状态。若修改成功则返回成功;若修改失败则返回失败。(见1.4和1.5)
  5. 配对成功后,可以通过周期调用心跳请求来维持双方长连接。
如何结束

基于上面的模型,可以满足两个用户配对的基本需求,同时通过轮训来感知对方状态以及互动。但是也存在问题:配对信息将会一直处于“成功状态”,没有有效的终止状态。
配对的终止实现方式也有很多,这里列出几种常用方案:

  1. 心跳请求中检测对方的心跳,若心跳不存在则修改双方配对状态为“结束/无效”。
  2. 请求配对时检测心跳,逻辑同上。与方法1区别在于配对过程中如果对方掉线,不会直接结束此次配对。
  3. 通过异步线程扫描所有“有效”的配对记录,检测每一个配对的心跳。该方法需要找到合适的扫描周期,如果出现网络延迟,可能会出现用户已经重连但是被kill的情况。

待完善:

  • 多方用户配对
  • 区分用户角色,同一角色不可相互配对
  • 组队配对