高并发实时后台服务技术架构杂谈

高并发实时后台服务设计杂谈

摘要:不管是双十一剁手节还是新年微信红包,此时此刻都离不开一个可靠和稳定后台服务,针对高并发(每秒上万的QPS),低延迟(毫秒级应答)的业务场景,后台架构的设计对业务的成败以及用户体验起到了至关重要的作用。根据No Silver Bullet理论,在软件工程里是没有万能的终极武器,只有将各种方法综合运用才是王道。本文根据作者的经验总结一些可参考的实时高并发后台架构解决方案。

流控

后台服务可以支撑的最大并发量,虽然理论上可以通过添加节点(机器)的方法横向扩展,即扩容,但考虑到成本通常后台服务都会存在一个预估的能力上限。开发和运维同学会根据业务预估的请求量和后台单个节点可以支撑的最大并发量来计算可能需要部署的后台节点数量。其中,单个后台节点的处理能力可以通过压测得到。这里可能埋藏了一个隐患,因为人的预估都是不准确的,如果不幸后台服务的最大支撑能力低于了实际用户的请求量,那么对后台系统造成的影响可能就如同DDOS攻击,严重的话整个后台服务都会出现不可用,那么对用户和业务都是不可接受的。

因此,后台服务首先要把自家大门累扎实,方法就是流控。根据业务场景定制合理的流控策略。比如,60秒内相同的用户只能访问5次,否则在最前端直接拒绝,减少对后台更底层系统的不必要的压力,从而防止后台服务的过载。举个现实中的例子,每逢过年都要在12306上刷火车票,用户输入验证码的策略除了起到安全鉴权的作用,也是对用户请求的一种流控。工程中的具体策略有:在入口层添加一层Nginx或者OpenResty网关,然后针对请求执行一些最基础的限流操作,比如,当前支持的最大连接数,超出则返回50x错误,由前端根据错误码给用一个友好的提示,请用户稍后再试。

负载均衡

网关层除了流控功能外,还有一个重要的Balance Load的作用。就是将大量用户的请求通过负载均衡策略(WRR/SP)合理地分发给后端节点。比如,后端有3个节点,通过对每个节点分配不同的权重,每个节点会分发不同的流量,一些高配置的节点可以多处理一些请求。

接入层

通过网关层执行一些基础的流控策略,然后再由网关层将请求转发给后端的接入层。通常接入层由Web服务(比如Apache)的CGI实现,接入层主要实现一些业务层面的基本校验功能,比如,登录态校验。从而又可以过滤大部分非法请求,为真正合法的用户请求留出珍贵有限的后台资源。通常接入层都是无状态的,因此可以横向扩展。

逻辑层

根据“前轻后重”的原则,接入层一般只执行一些轻量的业务逻辑,真正核心的业务逻辑放在逻辑层来实现。逻辑层通常由RPC服务来提供和实现,接入层通过逻辑层提供的标准协议(HTTP/PB/MSGPACK等)和RPC调用接口来完成通信。其中,RPC调用接口也会提供BL的功能,不需要接入层关心后端的容灾切换问题。因为逻辑层是真正核心处理的模块,它的处理能力决定了整个服务的质量,因此逻辑层的设计非常重要。下面罗列一些可以优化整个服务的设计原则:

缩短关键业务流程

同步接口数量越多服务一定越差,因为每个接口都会产生时耗,那么整笔请求的处理时耗也会相应增加。一些不重要但又不能不做的接口可以设计为单独的流程来处理。比如,用户抢红包成功了,红包有可能并没有立刻到账,但是为了不影响用户体验,前端会提示用户红包可能有延迟到账等信息,但不管怎么样红包已经抢到了不影响结果,后台服务可以通过消息队列慢慢(在合理的时间内)处理,用户也可以接受。

降低单个接口处理时耗

关键流程的接口数量已经不能减少了,那么这时就要优化单个接口的处理时耗。这里需要根据情况来综合考虑,有可能是代码的问题(比如,系统调用太多),也有可能是架构问题(比如,可以通过缓存来优化),或者可能是系统部署的问题(比如,没有就近访问,跨城访问从深圳访问上海)。

同步变异步

当关键流程的接口数量和单个接口的处理时耗都确定后,剩下就是要把同步接口换成异步接口,这个做法不会降低单笔处理时耗,但是可以保证整个服务吞吐量,不会因为突然某个接口出现异常导致整个服务堵塞。用现实中的例子举例就是,一条道的公路可能因为某辆汽车出现故障导致后面的汽车也无法通过,而五条道的公路即使一条道出现拥堵也不影响其他道的车辆行驶。工程中的实现方法是:I/O多路复用。

隔离

因为逻辑层可能涉及的业务错综复杂,很可能某个业务自己没做好影响了整体的服务质量,因此逻辑层也要具备业务隔离的能力。工程中实现的方法有:整体隔离,接入层根据业务来进行分发处理;内部隔离,逻辑层为每个业务分配的资源可配置。

存储层

存储层主要解决的是数据快速访问,大数据量如何存储,以及数据一致性安全问题。对应的解决方案分别是缓存,分库分表,数据如何同步备份。很多大公司都提供了自己的一套解决方案,然后放在云上售卖,具体的设计可以参考相关的官网说明。

总结

主要根据系统分层设计阐述每一层在高并发设计上的一些考虑点。

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值