推送技术总结

概述

  • 从客户端是手机APP的角度来理解推送(PUSH),展示的形式有两种:

    1. App 推送:消息内容通过手机通知栏(状态栏)展示
    2. 应用内消息:各种业务数据推送(通过定义模版或命令号等方式推送给APP内的业务使用)
  • 从Web端角度看理解推送,一般只有网页内消息(跟手机APP的应用内消息是一样的类型)

  • APP推送:

    1. 在线推送(应用级方案):APP进程控制推送消息,理论上只要APP要获得“手机通知栏”的权限(一般通过在APP内维持长连接来进行推送,但前提是APP已经启动和运行,并且能常驻)
    2. 离线推送(系统级方案):通过手机操作系统或手机厂商提供的通道进行推送。这种推送方式可以在APP未启动的情况下,推送APP的消息。
    3. APP进程运行时,应该优先走在线推送,自己的推送系统更快、更有保障。
  • 应用场景

    • APP推送:电商内APP(推送促销消息)
    • 应用内消息:直播类APP(推送送礼特效消息)
    • APP推送和应用内消息都需要:IM类APP(推送用户聊天信息)
  • 从推送的实现角度看,基本可以概括为两种:主动轮询(pull 拉)和长连接 (push 推)

实现方式

  • 以下实现方式没有进行严格分类,从原理上看存在相互联系
  1. HTTP轮询

    1. 短轮询(Polling)
    2. 长轮询(Long-polling)(Nacos和apollo配置中心也是用这种)
    • 从TCP的角度看HTTP长轮询:HTTP开启keepalive,服务端保持连接并不需要发额外数据包,有数据时可以立刻推送,跟TCP长连推送无异。展示服务端有点费连接的相关资源,数据包是HTTP相比较大而已。
  2. SSE (Server Sent Event 服务器发送事件)

    • sse 单通道,只能服务端向客户端发消息; webscoket 是双通道
    • 实现成本较低
    • http 协议,服务端响应的是text/event-stream类型的数据流信息
    • 场景:站内信、未读消息数、状态更新、股票行情、监控数量等场景
  3. WebSocket

  4. MQTT (通常结合TCP长连接一起使用)

  5. TCP长连接(自定义消息或protobuf等格式)

  6. 系统级方案

    • Android和IOS本身的消息推送(Android的C2DM和IOS的APNS,系统与服务器建立连接,APP向系统注册关注的消息,实现系统级消息推送)
    • 国内Android无法访问Google服务器,所以国内的手机厂商比如小米、OPPO、华为等,都实现来各自的系统级推送。
    • 避免维持长连接而导致的过多资源消耗,IM类要求即时的更应该接系统级推送
  7. 第三方推送平台

    • 集成各种手机平台,各种推送类型,甚至短信等推送
    • 简单来说:由专业的平台做专业的事(太麻烦了,我只是想推送了消息,帮我搞定吧。。。)

Reference