我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

随着京东的发展,出现了一些有意思的小系统和模块,解决了一些业务系统的痛点,这些小系统和模块虽然并不复杂,但是解决了当时的痛点,数据支撑就是其中一个痛点,由于依赖的系统或者其他方面的不稳定,导致用户访问页面会404或者503,或者出现空窗(页面部分内容不显示),这在大流量的系统中是不允许的,因此需要一个更加健壮的系统来解决这个问题,解决这个问题的方法大家也都差不多,所以作者抽象出了一个小模块,为更多人解决底线问题。

为了提高系统的可用性,大多数以读为主的系统都会采用各种策略来提升用户体验,数据承保就是其中一种策略,数据承保也可以称为数据备份,一般解决以下几个问题:

实际项目中数据支撑的方式有很多种,最简单直接的就是将支撑功能完全耦合到自己的业务系统中,后续每开发一个系统甚至每增加一个业务功能都要重新实现,是一次性的支撑功能,当系统本身出现故障时,支撑就无能为力了。

为了减少代码冗余,降低代码维护成本,可以将这个功能抽象出来(如果业务系统是Java语言的话,可以以jar包的形式提供服务),然后把需要支持的业务全部收集起来(可以是收集URL,业务方法等)放到一个配置文件中,用来更新底层数据。比如京东的三级列表页是爬取所有页面然后静态存储的,也就是存储整个HTML片段,如果列表页依赖的服务出现问题,那么直接使用后备数据;如果有些页面爬取不出来,可以返回列表页第一页作为后备数据,这种形式明显比第一种好很多(比如耦合度高,他需要准确知道哪些业务需要后备(指定URL或者方法入参),不能跨语言使用,如果系统本身崩溃,后备也会失效)。

还有一种方式就是把这个功能完全独立成一个系统,以HTTP的形式和目标系统通信。假设目标系统有10个页面需要支撑,我们可以把这10个页面的URL告诉支撑系统,底层系统可以定期去抓取我们的页面,然后把正确的数据放到存储设备上,目标系统可以利用Nginx来决定如何、何时读取这些数据。这种方式可以做到对目标系统的无侵入性,也可以跨语言,而且即使目标系统崩溃了,只要Nginx没宕机,还可以提供服务。但是这种方式无法动态获取需要支撑的资源,查询数据时需要明确指定URL。试想如果目标系统有几亿个页面需要备份,是没有办法通知支撑系统的;如果多个目标系统依赖同一个支撑系统,就会存在单点风险。

可以看出,上述几种方法或多或少都存在一些缺陷,因此,为了更好的解决这些问题,本文采用了一种基于Nginx+Lua利用aop原理的组件化底层方法。

该方法具有以下特点:

对目标系统零入侵

可以动态拦截请求(无需预先配置URL)

数据存储设备的选择

您可以选择何时更新基础数据

可以验证底部数据

记录性能日志

简单配置

数据流图:

nginxlua开发实战_nginxlua脚本_nginx lua

具体实现过程:

1、当用户发起请求时,该组件进行拦截,然后向后端发起请求。在这个过程中,我们可以对请求进行限流,可以有效的保护后端服务器。使用lua-resty-lock和lua-resty-limit实现。lua-resty-lock是基于nginx时间事件的非阻塞锁,使用它可以有效的防止狗堆效应;lua-resty-limit——基于漏桶算法的限流组件。

2、若回源失败,直接获取底部数据并返回;若回源成功,则继续下行。

3.数据成功返回源头之后,需要校验是否正确,比如数据格式是否正确,是否缺少某个字段,是否缺少某个HTML元素等,这些校验器可以根据各自的业务进行扩展,如果校验失败则根据该字节取底层数据并返回;如果校验成功则继续往下走。

4、检查底层数据是否可以更新,可选的策略有三种:实时更新,即每次请求时都更新底层数据;每隔一定时间更新;第一种策略实现起来比较简单,第二种和第三种策略都需要对请求进行标记。

第二种实现方式讲解,使用nginx的共享字典来存储标签,伪代码如下:

nginx lua_nginxlua开发实战_nginxlua脚本

5.若不需要更新,则直接返回源数据。若需要更新,则继续执行第6步。

6.此步骤将响应数据回源存储到底层存储中。底层存储可以是Redis、MySQL、Nginx共享缓存、本地文件等,使用Lua-resty-redis、Lua-resty-、Lua-resty-mysql、popen实现。所有底层存储都必须实现指定的动作,如get、set、del等动作。

使用Redis存储的伪代码如下:

nginxlua脚本_nginxlua开发实战_nginx lua

另外,在请求过程中、请求返回、请求回传过程中都会记录性能日志,方便后续分析接口性能、告警使用等。

该使用方式对目标系统无侵入,使用简单;不过Nginx需要集成Lua函数才能使用,例如先在Nginx.conf中配置如下指令:

nginxlua脚本_nginx lua_nginxlua开发实战

(注://demo为/demo的回源调用URI,即按照惯例这里要写回源URI)

该模块是纯Lua实现,下面对该模块做简单介绍:

网站系统除了完成其业务功能外,还需要有数据备份,保证系统的高可用性,为了保证系统的高性能,尽可能的提高系统的GPS,一般都会进行数据缓存。

本项目基于Nginx+lua解决数据支撑,提高系统qps,并且对原有系统零侵入,运行只需要对Nginx进行一些简单的配置即可。

项目目前支持两个模块,分别是和缓存:

您可以自由选择将数据存储在不同的存储上:

对于模块,有多种数据更新策略可供选择:

监控报警:

总结:

从上面的描述我们可以看出,这个组件对于目标系统是无侵入的;使用起来很简单,只需要在 Nginx 层进行一些简单的配置即可;而且只要 Nginx 没有宕机,那么目标系统就算宕机了,也还是能够提供服务的。很简单,就是在目标系统外面加一层代理,然后我们在代理层就可以做各种事情了;也就是整体的思路就是遵循 AOP 的。目前京东、三峡项目的一些频道页都在使用这个方案。

推荐后端技术交流QQ群:;一起探索后端技术的广度与深度。

二维码
扫一扫在手机端查看

本文链接:https://by928.com/5681.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线