关于一个每天请求50W次接口的设计实现过程
从大学开始关注博客园,到工作之后注册了博客园账号,直至今日终于能够静下心来将自己个人的所学,所得,所悟能够分享出来与大家分享,好开心~
言归正传,需求背景是博主所在的公司为一个在线OTA公司,客户端上各个项目(酒店,机票,景区,出境之类)的订单列表接口融合在一起之后对客户的查看订单非常不方便,而且列表信息相对于客人来说过于冗余,但是列表接口又不能缺少,为了推动客户体验,将当前待使用的行程信息能够更加完整的展现给客户,于是推动了行程助手的需求。
该需求主要目的就是将客人的历史订单摒弃掉,而将客人待出行使用的订单信息完整的表现给客人,提升客户的出行体验。
需求下来之后,针对于我这边,机票项目而言,需要做到的不仅仅是将订单信息展现出来,围绕行程这个主题,需要将航班的动态信息也能够动态的展现给客人。
需要解决的几个问题:
1.航空公司信息,机场信息为静态信息,查询数据库过于浪费
2.查询的信息较多,需要优化查询sql
3.动态信息由于不和订单相关联的表在一个数据库中,而跨库联查不可取,需要重点解决
问题思考过程:
1.航空公司和机场信息这种静态信息,查库是明显耗时耗力的,航空公司的信息由于比较少,表内的记录在五十条左右,因此采用单例模式,将信息加载在内存中直接调取即可。机场信息由于存在的记录在五百条左右,而且每条信息的维度很多,因此采用了Redis这种支持List的存储系统,提高性能。
2.查询SQL,涉及到了5张业务逻辑表的查询,与DBA确认查询索引,提高查询语句的性能。
3.航班动态信息从供应商处推送获得会落地到本地库中,由于更新比较频繁,而且跨库查询太耗时,因此数据库这一块已经暂时放弃了,
处理动态信息方面,博主使用了MC(Memcached)+JOB(不明白的同学百度Quartz调度系统)搭建了更新航班动态信息的缓存框架,
主要思路是,使用JOB捞取供应商落地的信息,根据推送时间,每60秒捞取一次当前最近90秒的更新信息,同时将订单相关的一些固定信息也一并组装,同步到MC中。
在接口内部进行查询的时候优先进入MC中查询信息,当MC中查询不到时再去库里捞取,拼装返回
收获:
1.逻辑上的思考需要缜密,将有可能碰到的问题列出来,逐一的思考解决方案就会找到胜利的钥匙
2.在数据库发生瓶颈,难以达到预期效果时,巧妙的去运用缓存(单键类,Redis,MC)是一个非常好的解决方案,但是缓存的更新机制需要考虑清楚,否则会成为一个累赘
关于一个每天请求50W次接口的设计实现过程的更多相关文章
- 一个vue请求接口渲染页面的例子
new Vue({ el:'#bodylist', data: { list: [ { "type_id": "1", "type_name" ...
- JMeter基于http请求的web接口性能测试总结
[本文出自天外归云的博客园] 基于http请求的web接口性能测试总结 压测的目的:对于Web接口压测的目的最终是要在对数据库造成压力的情况下观察压测服务器的cpu是否达到预警值.memory是否发生 ...
- 【JMeter】JMeter完成一个java请求的压测
先定义一下我说的remoteService:即远程调用服务,没有http的url.不对外提供或者对外提供有限的服务.具体视各公司的代码架构所定,比如有些公司为web工程,scf服务,db.scf即为服 ...
- 一个用js写的接口http调试程序
公司有非常多手机app的项目.手机app又要常常訪问后台提交与查询数据. 所曾经端app与后台的开发与測试过程中接口调试是一个常常要做的工作. 而每当出现一个BUG,前端appproject师与后台p ...
- GOLang(第二篇 发起一个Http请求)
import ( "net/http" "net/url" ) //发送一个简单的get请求 func GetRequest { //联系使用 make(map ...
- 网站开发进阶(四)Tomcat Server处理一个http请求的过程
Tomcat Server处理一个http请求的过程 假设来自客户的请求为: http://localhost:8080/wsota/wsota_index.jsp 1) 请求被发送到本机端口8080 ...
- 解决Ajax请求后台Servlet接口拿不到JSON数据问题
前端Ajax请求代码如下: window.onload=function() { var url='http://127.0.0.1:8080/testpj/ErrorlogServlet'; $.a ...
- iOS开发之线程组解决请求多个接口数据,完成后,再刷新界面
1.多任务请求接口,完成后,在刷新数据,常用方法 2018年07月18日 16:34:38 hbblzjy 阅读数:1382 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...
- 接口测试工具-Jmeter使用笔记(一:运行一个HTTP请求)
博主自从毕业从事软件测试行业距今一年半时间,大多数时间都在跟各种API打交道,使用过的接口测试工具也有许多,本文记录下各工具的使用心得,以及重点介绍我在工作中是如何使用Jmeter做测试的,都是在wi ...
随机推荐
- HDU 4050 wolf5x(动态规划-概率DP)
wolf5x Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- javascript特效实现(4)——当前时间和倒计时效果
这个效果的实现关键是对Date对象和setTimeout的使用. 一共有三个例子,HTML结构如下,就不添加CSS样式了. <body> 当前时间:<p id="p1&qu ...
- Python2
安装pycharm专业版,不要汉化 要想写的代码支持linux和2.0版本需要在开头加上注释 #/usr/bin/env python #-*- coding:utf-8 -*- 运算符 结果是值 算 ...
- char,vchar,nchar,nvchar的区别
char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据.所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在 ...
- Hive variable demo
create table ori_trans (account string, maker string, tdate string) partitioned by (country string); ...
- Oracle Jdbc demo
两种方式: thin是一种瘦客户端的连接方式,即采用这种连接方式不需要安装oracle客户端,只要求classpath中包含jdbc驱动的jar包就行.thin就是纯粹用Java写的ORACLE数据库 ...
- [转]移动web开发中meta标签作用
今天在尝试做移动页面的时候遇到了一个问题,<meta content="telephone=no,email=no" name="format-detection& ...
- docker containerd中的容器操作
containerd的中的各种操作都是通过Task来进行的,因此对于容器的create, start, delete等等操作其实都是一个个的Task而已. Task的数据结构如下所示: type Ta ...
- jmeter的使用(一)
1.下载jmeter:http://jmeter.apache.org/download_jmeter.cgi 2.启动jmeter,打开jmeter.bat 3.添加线程组 4.添加http请求 5 ...
- 双向广搜 codevs 3060 抓住那头奶牛
codevs 3060 抓住那头奶牛 USACO 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 农夫约翰被告知一头逃跑奶牛 ...