一个简单的提高服务端十倍并发访问的例子
案例
一个架设在云端的疫情地图案例:
当架设在云端的服务器需要通过接口获得在北京的服务器上的数据时,用户的每一次访问疫情地图的页面都必须重新从北京的服务器取得数据,导致了广州的服务器与用户之间的交互需要将近300ms的时间,一秒之内只能服务于1000ms/300ms≈3个用户。
我们可以发现这其中占用时间最多的步骤是广州的服务器从北京的服务器取得数据这段过程,如何压缩或者省去这段时间呢?我们可以采用本地缓存的策略。
一、本地缓存的原理
我们可以在本地使用一个变量保存获取到的数据,并且使用时间戳保存获取的时间,通过判断用户访问服务器的时间与时间戳的间隔,小于10分钟(或者需要的时间段)的话不需要再次重新获取数据,大于10分钟时再重新获取,这样就能节省掉取得数据的时间。
二、实现步骤
1.原服务器端代码如下:
//创建一个URL对象
URL url = new URL("疫情数据接口api");
//建立连接,获得连接对象conn
URLConnection conn = url.openConnection();;
//通过连接对象获得输入流is
InputStream is = conn.getInputStream();
//将输入流装饰为一次能读取一行的缓冲字符输入流br
BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
//获得读取的内容
String text = br.readLine();
//关闭输入流
br.close();
2.建立本地缓存
String text = null;
long time = 0;
3.修改服务端代码块
//当用户访问的时间与时间戳相减大于10分钟才重新获得数据
if(System.currentTimeMillis()-time>600000) {
//获得加载数据时的时间戳
time = System.currentTimeMillis();
//创建一个URL对象
URL url = new URL("https://zaixianke.com/yq/all");
//建立连接,获得连接对象conn
URLConnection conn = url.openConnection();;
//通过连接对象获得输入流is
InputStream is = conn.getInputStream();
//将输入流装饰为一次能读取一行的缓冲字符输入流br
BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
//获得读取的内容
text =br.readLine();
//关闭输入流
br.close();
}
该方法通过建立本地缓存的方法,把获取到的数据保存在本地变量中,多个用户同时访问服务器时,只需通过比较时间戳就可以知道是否需要重新获取资源,节省了服务器向接口api多次请求数据消耗的时间。
总结
该方法仅针对消耗服务器资源较大的环节出现在与其他服务器访问时间较长的情况。如果是用户访问服务器消耗资源较大的情况,该方法并不能较好的解决并发访问的问题。
如何解决用户访问服务器的时间较长的问题呢?一是面向用户,选择地理位置较近的服务器进行架设,如用户在国内,则尽量假设在本地的阿里云、华为云等服务器上,如果用户在国外则可以选择亚马逊云、微软云、谷歌云等国外的服务器平台。