长连接

46次阅读

共计 1214 个字符,预计需要花费 4 分钟才能阅读完成。

本篇是工程开发的网络一个分篇,整体见:https://segmentfault.com/a/11…。
概述
长连接原本核心只是消息推送和部分数据上报,一般公司里面当成 IM 用的会比较多
后来演变成一个通道,不只是 IM,消息 push,就连短连接也走这个通道。降低连接成本,尤其是位置上报 push 等场景,还可以利用高速通道做多点接入

一. 外部连接

native APP 使用 TCP 直连长连接域名,通过 LVS/TGW 的转发(gz 机房为 FULLNAT 模式,QQ 机房貌似是 TUNNEL 模式),连接到某个 CONNSVR 的对外服务端口上(支持加密和非加密两种),

二. 连接网络过程

此时 APP 与 CONNSVR 完成了 TCP 的三次握手,然后开始业务层面的握手,握手过程如下:

三. 架构和功能

下行,push

● 业务向 push 推送数据,可能提供 uid,也可能提供 role+phone 进行索引
● 如果是 role+phone 的形式,则 push 需要向 AAASVR 发起请求,使用 role+phone 获取 uid,注意这里会导致 AAASVR 的流量增大很多
● PUSHSVR 使用 uid 向 CONNMASTER 请求,获取用户所在的 CONNSVR
● PUSHSVR 将数据推给 CONNSVR,后者推给 app
● 如果用户不在线(step 3 查询失败),或者 CONNSVR 发送失败,则 PUSHSVR 根据消息推送的不同策略(由业务方指定),决定是否将消息写入 REPUSHSVR,REPUSHSVR 则会不停的将消息重新推回 PUSHSVR 进行重试

上行统一接入

  • 统一接入后,依赖端上请求中 Header 携带的 city_id,配合 Apollo 实现流量切换(可统一在 LVS 做)
  • 过程
    1.App->Connsvr->Trans, 携带端上从 HTTP 请求转换来的内容,例如 Header、Body 等
    2.Trans->Connsvr->App, 这个用于快速回复 App 刚才发送的 Req 是否通过了拆包、路由检查等结果,因为 App 连接变动,这个包可能回不到 App 上
    3.Trans->Push->Connsvr->App, 这个和一般下行包类似链路,用于携带真正的 HTTP RSP
  • trans 工作:
    1. 接受 Connsvr 转发过来的 REQ@PB
    2. 配置路由,根据 REQ@PB 中的 Scheme+Host+Uri,找到对应的内网 Router VIP:VPORT
    3. 翻译 REQ@PB 到 REQ@HTTP,发往 Router 的内网 VIP:VPORT(Router 实质上变为了 InRoute,域名变为了路由 key)
    4. 在 Timeout 内,维护 REQ 的信息(此时如果 Trans down 了,则状态丢失,引入缓存来维护 state)
    5. 收到服务端的 RSP@HTTP 后,翻译成 RSP@PB,通过 pushsvr 发往 App(Pushsvr 会完成路由寻找和发送功能)

多点接入

引入长连接后建立连接的代价少,可以维持高速通道,就近设置接入点,接入点到真正的业务接入点之间可以走专线,更快

正文完
 0