当前位置: 首页 > 科技观察

演进:Tengine从Web代理服务器到分布式推送服务器

时间:2023-03-16 23:38:25 科技观察

TengineTengine作为代理服务器,在集团内有着广泛的应用基础,从部署在单台应用机上的Tengine到部署为集群的统一接入Aserver,可以说集团的应用机器几乎都跑的是Tengine。当然,Tengine的不同部署形式有不同的功能,这都归功于Tengine是一款优秀的高性能、低延迟、高可用的反向代理服务器。下图展示了一种常见的统一接入模型:HTTP长连接业务现状。不管客户端发起的请求是HTTP2还是HTTP1.1,Tengine作为一个反向代理服务器,应用服务器与应用服务器之间的连接是短连接的(除非Tengine配置keepalive),如下图:Tengine负责与客户端的长连接保持存活,应用服务器使用特定的负载均衡算法进行短连接调度。目前的HTTP推送方案通常是推送请求,需要定时向终端发送数据,轮询终端定时发送请求轮询获取业务数据。这是最容易想到的方法,但在实际项目中往往也是最不可能使用的。因为它的缺点非常明显:1.较短的轮询请求间隔会导致服务器无缘无故地处理无用的QPS,而QPS与终端数量成线性正比。2.较长间隔的轮询请求不能保证推送时效性应用服务处理是指Tengine作为反向代理服务器,只完成基本的转发能力,业务HoldHTTP请求,必要时响应。劣势很明显。应用需要自己维护长连接的生命周期,推送场景的用户都是非常大规模的终端设备。超大规模的长连接显然会消耗大量的应用机器资源。HTTP2的推送(ServerPush)实际上,HTTP2的推送功能是指一次请求多次响应,不符合我们通过长连接通道持续传输数据的要求。此处粘贴RFC对ServerPush功能的介绍,此处不再展开。HTTP/2allowsaservertopre-emptivelysend(or"push")responses(alongwithcorresponding"promised"requests)toaclientinassociationwithapreviousclient-initiatedrequest.Thiscanbeusefulwhentheserverknowstheclientwillneedtohavethoseresponsesavailableinordertofullyprocesstheresponsetotheoriginalrequest.Tengine单机推送目前,主流开源Nginx模块有支持单机推送功能。ThepushprocessisactuallyverysimilartotheSUBMQTT的PUB模式,不过是用HTTP实现的。具体过程如下:1、A发起请求,Tengine劫持请求Hold,Tengine为其产生对应的KeyA。2、如果B要向A推送数据,可以使用KeyA作为参数(或Header)向指定的Tengine发送POST数据。3.Tengine会收到B的POST数据,得到KeyA对应的connection,返回给A。缺点1.B需要知道A的存在,即当A的请求到达Tengine时,Tengine需要绕过它发送给B,即需要通知BA的存在,B需要记录A对应的KeyA。解决方法:可以使用Tengine的auth_request函数,当然也可以使用Lua的ngx.location.capture方法等效。2.如果Tengine部署在集群中,B需要集中存储。B通常是一个非单体应用,即由多个微服务组成。无论在哪个环节,当B需要向A推送消息时,显然需要知道A在Tengine集群中,因此在应用B中,至少需要确定一个微服务由中心化存储(如redis、memcache)向哪个Tengine发送请求。Tengine实现方案1.Tengine自带中心化存储。Tengine为每个TCP连接生成一个key(也可以使用请求头作为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。2.支持流式传输一般情况下,长连接希望接受多个推送消息,而不是在一个推送消息结束后创建一个新的。Tengine依赖其丰富的HTTP处理能力,使用multipart/form-data。是的,推送数据有一个明确的边界,多个数据推送可以有一个明确的分界线,客户端只需要一个连接就可以获得多个推送数据。3、多协议支持Tengine本身支持多种协议,无论客户端发起的是HTTP还是HTTP2,都可以继承上述推送功能。4、高性能Tengine自身作为代理服务器,转发性能为业界标杆。我们在Tengine的转发过程中加入了集中存储的能力,使Tengine具备了分布式路由的功能。