Tengine


Tengine 作为代理服务器,在集团有着广泛的应用基础,从 部署在 应用单机上的 Tengine ,到作为集群式部署的统一接入 Aserver ,可以说集团几乎所有应用机器均运行着 Tengine 。当然, Tengine 的不同部署形态,其作用也不经相同,这都得益于Tengine 作为优秀的反向代理服务器,有着 高性能、低延迟、高可用 等特性。下图是常见的统一接入模型:

当前HTTP长连接业务现状


无论客户端发起的请求是 HTTP2 还是 HTTP 1.1,Tengine 作为反向代理服务器,和应用服务器之间均是短连接(除非 Tengine 配置 keepalive ),如下图所示:Tengine 负责和客户端进行长连接的保活、和应用服务器使用具体负载均衡算法进行短连接调度。

当前HTTP的推送解决方案


通常推送的诉求,是需要定时的往端上发送数据,轮询端上 定时发送请求来轮询获取业务数据。这是最简单且最容易想到的手段,但往往也是在实际项目中最不可能使用的方案。因为其缺点非常明显:
1、较短间隔的轮询请求会导致 Server 端无端的处理无用的 QPS ,且 QPS 与端的数量成线性正比
2、较长间隔的轮询请求,其推送时效性无法保证

应用服务处理

即, Tengine 作为反向代理服务器只完成基本的转发能力,业务 Hold 住 HTTP 的请求,并且在必要时,对其进行 response 。缺点很明显,应用需要自己维护该长连接的生命周期,而往往推送场景的使用者均是超大规模的终端设备,超大规模的长连接很明显会消耗大量应用机器资源。

HTTP2 推送(Server Push)

实际上 HTTP2 的推送功能指的是单个 request 有多个 response ,与我们长连接通道持续传输数据的需求不匹配。
这里贴上 RFC 对 Server Push 功能的介绍,在这里就不再展开了。

HTTP/2 allows a server to pre-emptively send (or "push") responses   (along with corresponding "promised" requests) to a client in   association with a previous client-initiated request.  This can be   useful when the server knows the client will need to have those   responses available in order to fully process the response to the   original request.

Tengine 单机推送目前,主流开源 Nginx 模块有支持单机推送功能 。

推送流程

实际上和 MQTT 的 SUB PUB 模式非常相似,只是用 HTTP 来实现而已,下面是具体流程如下:1、A 发起请求,Tengine 劫持请求 Hold 住, Tengine 对其生产一个对应的 KeyA 。
2、B 若期望推送数据到 A ,可用 KeyA 作为参数(或者 Header ),发送 POST 数据到指定Tengine。
3、 Tengine 将收到的 B 的 POST 的数据,获取到 KeyA 对应的连接,即可返回给 A 。缺点1、 B 需要感知 A 的存在 B即当A的请求到达 Tengine 时, Tengine 需要旁路发送到 B ,即需要 告知 B ,A 的存在,并且 B 需要记录 A 对应的 KeyA 。解决方案:可以使用 Tengine 的 auth_request 功能,当然等价的也可以使用 Lua 的ngx.location.capture 方法。2、Tengine 若是集群化部署,B 需要中心化存储B 通常是非单体应用,即由多个微服务组成,无论在哪个环节,当 B 需要推送消息到A时,显然需要知道 A 在 Tengine 集群中的哪台机器,故B应用中,至少某个微服务需要由中心化存储(例如 redis、memcache )来决定将请求发送至哪台 Tengine 。

Tengine实现方案


一、Tengine 自带 中心 化存储

Tengine 对 每个 TCP 连接生成一个 key(也可以使用请求 Header 等作为 Key ),在中心化存储中保存 key 和对应机器ip的映射信息。应用只需要往Tengine集群的任意一台机器推送数据,由 Tengine 来做分布式路由。下图从推送角度描述了 Tengine 如何工作。1、应用往 Tengine 集群随机一台机器推送,推送是携带对应的的 Key 以表示自己期望推送至哪个连接
2、Sc 收到 推送消息,在 Tair 中查找对应请求由哪台 Tengine 机器维护,例如查找到该推送目的连接在 Sb 。
3、Sc 转发到 Sb。
4、Sb 收到后,找到对应的客户端连接,将数据推送至客户端。应用可以是用 vipserver 随机查找 Tengine 机器, Tengine 也可以申请一个 vip/slb ,供业务访问,依靠 vip/slb 的负载均衡能力,随机访问 Tengine 。

二、支持流式传输

通常,一个长连接希望能够接受多个推送消息,而不是一个推送消息结束后再次新建, Tengine 依托其丰富的 HTTP 处理能力,使用  multipart/form-data ,是的推送数据拥有明确的 boundary ,多次推送数据都能有明确的分界线,客户端只需单个连接,就能获得多次推送数据。

三、多协议支持

Tengine 本身支持多种协议, 无论客户端发起的是 HTTP 还是HTTP2,均能继承上述推送功能。四、高性能Tengine 本身作为代理服务器,转发性能是业界的标杆,我们在Tengine转发流程加入了 中心化存储能力使得 Tengine 有了分布式路由的功能。作者信息:

陈嘉园,花名上虚,中间件技术-AliMesh&Tengine团队 高级研发工程师,负责Tengine&Ingress相关开发工作,目前主要关注云原生、Ingress等技术方向。

本文缩略图:icon by 黑夜太难熬

推荐阅读:

QPS 相比 Nginx 提升60%,阿里 Tengine 负载均衡算法揭秘

3 月全球 Web 服务器调查报告:Nginx 域名份额首超 Apache

看完这篇还不了解 Nginx,那我就哭了!

js轮询导致服务器瘫痪_演进:Tengine 从 Web 代理服务器 到 分布式推送服务器相关推荐

  1. js轮询导致服务器瘫痪_面试官:讲一下什么是负载均衡,什么是轮询策略随机策略哈希策略...

    什么是负载均衡? 先举个例子吧.以超市收银为例,假设现在只有一个窗口.一个收银员: 一般情况下,收银员平均 2 分钟服务一位顾客,10 分钟可以服务 5 位顾客:到周末高峰期时,收银员加快收银,平均 ...

  2. ajax 短轮询_ajax轮询导致浏览器内存每次递增

    ajax轮询导致浏览器内存每次递增,我也查过相关资料,有说在complete中 完整ajax代码: var Timer_getlastLog,ajax_flag; Timer_getlastLog = ...

  3. firebase 推送_如何使用Firebase向Web应用程序添加推送通知?

    firebase 推送 by Leonardo Cardoso 由莱昂纳多·卡多佐(Leonardo Cardoso) 如何使用Firebase向Web应用程序添加推送通知? (How to add ...

  4. Day 11: AeroGear 推送服务器:使应用的通知推送变得简单

    在今天的"30天学习30种新技术", 我打算去扩展一下昨天开发的 PhoneGap 应用,加上推送通知的功能.推送通知允许应用去通知或者警告用户,即使是在程序没有打开的情况下.例如 ...

  5. ubuntu11.04上搭建Android推送服务器

    来自:http://download.csdn.net/download/johnny901114/4410546 查阅了一些网上关于Android上实现推送的文章 , 常用的实现方法有: 1.使用a ...

  6. mpush 搭建消息服务器,MPUSH消息推送服务器搭建

    MPUSH消息推送服务器搭建 安装JDK 1.8 wget /jdk-8u121-linux-x64.tar.gz tar -zxvf jdk-8u121-linux-x64.tar.gz vim / ...

  7. win10消息推送服务器,怎么让win10推送

    近有Win7系统用户反映,自Win10版本发布以来,身边的朋友都已经升级了Win10了,可是自己至今都没收到Win10升级的推送通知,今天学习啦小编给大家介绍下怎么让win10推送通知吧. 让win1 ...

  8. 【苹果相册推送iMessage】群发公用推送服务器(APNS)

    推荐内容IMESSGAE相关 作者推荐内容 iMessage苹果推软件 *** 点击即可查看作者要求内容信息 作者推荐内容 1.家庭推内容 *** 点击即可查看作者要求内容信息 作者推荐内容 2.相册 ...

  9. netty多台服务器 推送消息,基于Netty的消息推送服务器集群设计与实现

    徐龙光 何顶新 摘 要:消息推送是当前移动应用中十分必要的一项技术,服务者需要使用消息推送以保持用户活跃度,提高应用存留率.为了满足消息推送的需求和增强推送系统的性能,采用Netty网络编程框架并搭建 ...

最新文章

  1. JS日期时间加减实现
  2. Angular 2/Ionic 2 @input和@output理解
  3. Android开发之实现每隔一段时间触发定时器android定时器
  4. 405: HTTP method GET is not supported by this URL
  5. 成功使用机器学习技术的3个技巧
  6. 卡巴斯基2014激活码授权文件KEY
  7. 调试STM32f401过程出现的问题
  8. 【C语言】用 1 分、5 分、10 分、25 分的硬币凑成任何给定的钱数 x,要求硬币的数目最少
  9. 爬取34万专栏文章:304篇10K+高赞文章汇总
  10. 按揭月供计算器(等额本息)
  11. 各向异性渲染(一)基础理论
  12. 图片的旋转,缩放和拖拽
  13. Java中String接受的最大字符串的长度
  14. 消费品行业会员营销的5大策略及建议
  15. 微波遥感(三、SAR图像特征)
  16. angularJS实战之小案例--随机抽奖
  17. 中信银行信用卡中心算法工程师 校招一面面经
  18. oracle 停止触发器语句,oracle触发器语句
  19. 买债券后回报率上升就是亏钱
  20. OkHttp 内存溢出问题 A connection to xxxxxx was leaked.

热门文章

  1. 方舟服务器显示队友位置,方舟如何看队友在哪 | 手游网游页游攻略大全
  2. 语音变音调和加速减速
  3. python 实时显示声音
  4. 人人都能学会的python编程教程14:高级特性1
  5. 如何改进安全运营和安全分析水平
  6. 几何画板表现两集合的差集的教程
  7. HDU 3826 Squarefree number:题目解答源码
  8. Delphi XE5 for Android (十)
  9. Android布局之weight属性解析
  10. sc config 命令(详细)