基于 Pushlets 的消息推送设计

Pushlets 是通过长连接方式实现“推”消息的。推送模式分为:Poll(轮询)、Pull(拉)。本文围绕 Pull 模式进行设计。

原理

客户端发起请求,服务端接收到请求后根据 Pushlets 协议进行处理。推数据通过 HTTP 响应返回。

客户端在接收到响应后根据 Pushlets 协议进行处理,重新发起请求。Pull 模式时序:

  1. join:join 请求,服务器端建立 Pushlet 会话
  2. join-ack:join 应答,返回会话 id
  3. listen:订阅并监听主题
  4. listen-ack:监听应答,返回会话 id,订阅 id
  5. subscribe(可选):订阅主题
  6. subscribe-ack(可选):订阅主题应答,返回会话 id,订阅
  7. refresh:长连接请求,实参会话 id
  8. refresh-ack:长连接响应,包括下一次 refresh 请求间隔
    hb:心跳响应
    data:推数据
  9. leave:清空订阅
  10. leave-ack:清空订阅应答

服务器端

服务器端主要负责维护会话,根据请求处理应答。使用内存队列维护每个会话的主题事件。

事件产生后通过分发器(Dispatcher)将事件发布到指定订阅者的事件队列里。Pull 模式使用阻塞队列,读超时(没有事件)后返回 hb 与 refresh 指令的应答。

事件发布

  • 广播:将事件发布给所有订阅者
  • 多播:将事件发布给匹配的订阅者
  • 单播:将事件发给某个订阅者

关键参数

订阅者的事件队列配置:

  • queue.size=24
    队列大小为 24。如果队列满了新发布到该队列的事件将被丢弃。
  • queue.read.timeout.millis=20000
    队列读超时 20 秒。读超时后返回 hb 与 refresh 指令的应答。该项配置即请求线程最长 hold 时间。
  • queue.write.timeout.millis=20
    队列写超时 20 毫秒。如果队列是满的,等待 20 毫秒后如果还满,则销毁该订阅者。

刷新时长配置:

  • pull.refresh.timeout.millis=45000
    服务器端刷新超时 45 秒。如果服务器端某订阅者超过 45 秒没有收到客户端的 listen 或 refresh 请求,则销毁该订阅者。该超时判断发生在发布事件时。
  • pull.refresh.wait.min.millis=2000
    pull.refresh.wait.max.millis=6000
    refresh 指令中指定客户端下次请求的等待时间区间,值取该区间内的随机值。

客户端

Pushlets 支持多种客户端,例如浏览器客户端、Java 客户端。浏览器客户端又分为 iframe 和 AJAX 两种。

初始化客户端后,客户端发起监听、订阅请求,并根据服务器返回指令发送 refresh 请求。当有 data 应答时,回调客户端 onData(event) 函数实现消息处理。

技术设计

对 Pushlets 做接口封装以屏蔽其特性细节,也便于以后兼容其他服务器消息推送技术(例如 WebSocket)做好铺垫。

封装的服务器推机制定义为 Channel 服务,提供服务器到浏览器客户端的消息推送。

服务器端

通过 Channel API 在 JS 客户端与服务器端建立长连接,使服务器端可以实时地发送消息给客户端。

JS 客户端

oaweb.Channel() 类:

  • init()
    初始化服务器调用 URL、客户端状态。
  • open()
    发送 join 请求,服务端创建会话。
  • subscribe(listeners : {topic, onmessage, onerror})
    发送 subscribe 请求,服务端创建订阅者,添加订阅主题。
  • unsubscribe(topic)
    发送 unsubscribe 请求,服务端移除订阅。
  • close()
    发送 leave 请求,服务端销毁会话。

时序

集群

均衡器通过源地址保持策略保证同一 IP 的请求均会分发到固定服务节点。

当服务节点进行业务逻辑处理后,发送消息到消息服务系统;

服务节点订阅消息主题,当监听到新消息时调用 Channel 服务发布消息到具体的推送实现组件(Pushlets)。

Pushlets 配置参数详解的更多相关文章

  1. mha配置参数详解

    mha配置参数详解: 参数名字 是否必须 参数作用域 默认值 示例 hostname Yes Local Only - hostname=mysql_server1, hostname=192.168 ...

  2. reids配置参数详解

    转自:http://www.jb51.net/article/60627.htm reids配置参数详解 #daemonize no  默认情况下, redis 不是在后台运行的,如果需要在后台运行, ...

  3. nginx配置参数详解

    配置参数详解 user nginx nginx ; Nginx用户及组:用户 组.window下不指定 worker_processes 8; 工作进程:数目.根据硬件调整,通常等于CPU数量或者2倍 ...

  4. Redis配置参数详解

    Redis配置参数详解 /********************************* GENERAL *********************************/ // 是否作为守护进 ...

  5. MHA配置参数详解 【转】

    mha配置参数详解: 参数名字 是否必须 参数作用域 默认值 示例 hostname Yes Local Only - hostname=mysql_server1, hostname=192.168 ...

  6. zookeeper的配置参数详解(zoo.cfg)

    配置参数详解(主要是%ZOOKEEPER_HOME%/conf/zoo.cfg文件) 参数名 说明 clientPort 客户端连接server的端口,即对外服务端口,一般设置为2181吧. data ...

  7. HAproxy 配置参数详解

    HAproxy 配置参数详解 /etc/haproxy/haproxy.cfg # 配置文件 ----------------------------------------------------- ...

  8. samba 配置参数详解

    samba 配置参数详解: 一.全局配置参数  workgroup = WORKGROUP说明:设定 Samba Server 所要加入的工作组或者域. server string = Samba S ...

  9. [转帖]持久化journalctl日志清空命令查看配置参数详解

    持久化journalctl日志清空命令查看配置参数详解 最近 linux上面部署服务 习惯使用systemd 进行处理 这样最大的好处能够 使用journalctl 进行查看日志信息. 今天清理了下 ...

随机推荐

  1. JAVA框架 Mybaits 输入和输出映射

    一.输入映射 当前端传来的参数,比较复杂,比如说用户名称.订单单号.账号信息等等.后端有可能有多个projo类对应这些信息.我们需要把这些的projo类封装成一个类似一个vo类. 通过设置字段形式关联 ...

  2. sql 两表更新

    UPDATE sale_origin_line set  state='cancel'  from  sale_origin p,sale_origin_line q  where p.id=q.or ...

  3. 20155211 Exp5 MSF基础应用

    20155211 Exp5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode? exploit:漏洞攻击.一个exploit程序肯定会触发系统的一个或多个 ...

  4. 20155217《网络对抗》Exp02 后门原理与实践

    20155217<网络对抗>Exp02 后门原理与实践 实验要求 使用netcat获取主机操作Shell,cron启动. 使用socat获取主机操作Shell,任务计划启动. 使用MSF ...

  5. 20155233 《网络对抗》 Exp8 Web基础

    实验内容 Web前端HTML Web前端javascipt Web后端:MySQL基础:正常安装.启动MySQL,建库.创建用户.修改密码.建表 Web后端:编写PHP网页,连接数据库,进行用户认证 ...

  6. 20155320 Exp9 Web安全基础

    20155320 Exp9 Web安全基础 [实验后回答问题] (1)SQL注入攻击原理,如何防御 SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗 ...

  7. 20155325 Exp2 后门原理与实践

    基础问答 例举你能想到的一个后门进入到你系统中的可能方式? 乱点链接 学电脑小白不正确配置电脑 下载非官网软件 例举你知道的后门如何启动起来(win及linux)的方式? 软件:ncat socat ...

  8. 行级安全(Row-Level Security)

    通过授予和拒绝(Grant/Deny)命令控制用户的权限,只能控制用户对数据库对象的访问权限,这意味着,用户访问的粒度是对象整体,可以是一个数据表,或视图等,用户要么能够访问数据库对象,要么没有权限访 ...

  9. 自制一个H5图片拖拽、裁剪插件(原生JS)

    前言 如今的H5运营活动中,有很多都是让用户拍照或者上传图片,然后对照片加滤镜.加贴纸.评颜值之类的.尤其是一些拍照软件公司的运营活动几乎全部都是这样的. 博主也做过不少,为了省事就封装了一个简单的图 ...

  10. Scrapy持久化存储

    基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作; 执行输出指定格式进行存储:将爬 ...