去哪儿网机票搜索系统的高并发架构设计(要点节选)
- 前端做静态文件的压缩,优化Http请求连接数,以减小带宽,让页面更快加载出来。
- 前后端做了数据分离,让搜索服务解耦,在高并发情况下更灵活做负载均衡。
- 后端数据(航班数据)99%以上来自缓存,加载快,给用户更快的体验。
搜索系统设计架构
前台搜索
主要读取缓存,解析,合并航班数据返回给用户端。
前台搜索是基于Web服务,高峰期时候最大启动了50台左右的Tomcat实例。搜索的URL规则是:出发城市+到达城市+出发日期,这和缓存系统存储最小单元:出发城市+到达城市+出发日期是一致的。
Tomcat服务我们是通过Nginx来做负载均衡,用Lua脚本区分是国际航线还是国内航线,基于航线类型,Nginx会跳转不同搜索服务器:主要是国际搜索、国内搜索(基于业务、数据模型、商业模式,完全分开部署)。不光如此,Lua还用来敏捷开发一些基本服务:比如维护城市列表、机场列表等。
高并发多线程应用
- Java Executor框架提供了完善线程池管理机制:譬如newCachedThreadPool、 SingleThreadExecutor 等线程池。
- FutureTask类灵活实现多线程的并行、串行计算。
- 在高并发场景下,提供了保证线程安全的对象、方法。比如经典的ConcurrentHashMap,它比起HashMap,有更小粒度的锁,并发读写性能更好。
高并发下数据传输
最早航班数据用标准的XML、JSON存储,不过随着搜索量不断飙升,CPU和带宽压力很大了。后来采取自己定义一种txt格式来传输数据:一方面数据压缩到原来30%~40%,极大的节约了带宽。同时CPU的运算量大大减低,服务器数量也随之减小。
在大用户量、高并发的情况下,是特别能看出开源系统的特点:比如机票的数据解析用到了很多第三方库,当时我们也用了Fastjson。在正常情况下,Fastjson 确实解析很快,一旦并发量上来,就会越来越吃内存,甚至JVM很快出现内存溢出。原因呢,很简单,Fastjson设计初衷是:先把整个数据装载到内存,然后解析,所以执行很快,但很费内存。
后台搜索
后台搜索系统的核心任务是从外部的GDS系统抓取航班数据,然后异步写入缓存。
机票的源数据都来自于各种GDS系统,但每个GDS却千差万别:
- 服务器遍布全球各地:国内GDS主要有中航信的IBE系统、黑屏数据(去机场、火车站看到售票员输入的电脑终端系统),国际GDS遍布于东南亚、北美、欧洲等等。
- 通讯协议不一样,HTTP(API、Webservice)、Socket等等。
- 服务不稳定,尤其国外的GDS,受网路链路影响,访问很慢(十几分钟长连接很常见),服务白天经常性挂掉。
- 更麻烦的是:GDS一般付费按次查询,在大搜索量下,实时付费用它,估计哪家公司都得破产。而且就算有钱 , 各种历史悠久的GDS是无法承载任何的高并发查询。更苦的是,因为是创业公司,我们大都只能用免费的GDS,它们都是极其不稳定的。
引入NIO框架
考虑GDS访问慢,不稳定,导致很多长连接。我们大量使用NIO技术:
NIO,是为了弥补传统I/O工作模式的不足而研发的,NIO的工具包提出了基于Selector(选择器)、Buffer(缓冲区)、Channel(通道)的新模式;Selector(选择器)、可选择的Channel(通道)和SelectionKey(选择键)配合起来使用,可以实现并发的非阻塞型I/O能力。
HTTP、Socket 都支持了NIO方式,在和GDS通信过程中,和过去相比:
- 通信从同步变成异步模式:CPU的开销、内存的占用都减低了一个数量级。
- 长连接可以支持更长超时时间,对国外GDS通信要可靠多了。
- 提高了后台搜索服务器的稳定性。
消息队列
为了异步完成航班数据更新到缓存,我们采用消息队列方式(主备AMQ)来管理这些异步任务。具体实现如下:
那么它具体如何运转的呢?
当缓存系统相关航班数据过期后,前台搜索告知MQ有实时搜索任务,MQ统一把异步任务交给Router,这个时候Router并不会直接请求GDS数据,而是去找Node池。Node池会动态分配一个Node节点给Router,最后Router查找Node节点映射的GDS,然后去请求数据,最后异步更新对应的缓存数据。通过技术的实现,我们把哪些不稳定的,甚至半瘫痪的GDS充分利用了起来(包含付费的一种黑屏终端,我们把它用成了免费模式,这里用到了某些黑科技,政策原因不方便透露),同时满足了前台上亿次搜索查询!
监控系统
鉴于机票系统的复杂度和大业务量,完备监控是很必要的:
1、整个Qunar系统架构层级复杂,第三方服务调用较多(譬如GDS),早期监控系统基于CACTI+NAGIOS ,CACTI有很丰富的DashBoard,可以多维度的展示监控数据。除此以外,公司为了保证核心业务快速响应,埋了很多报警阈值。而且Qunar还有一个NOC小组,是专门24小时处理线上报警:记得当时手机每天会有各种系统上百条的报警短信。
2、复杂系统来源于复杂的业务,Qunar除了对服务器CPU、内存、IO系统监控以外,远远是不够的。我们更关心,或者说更容易出问题是业务的功能缺陷。所以,为了满足业务需要,我们当时研发了一套业务监控的插件,它的核心原理如下图:
去哪儿网机票搜索系统的高并发架构设计(要点节选)相关推荐
- [转]去哪儿网机票搜索系统的高并发架构设计
"高并发"一直是大家感兴趣的话题.2010年~2012年,我曾在Qunar供职,主要负责机票搜索相关的业务,当时我们的搜索系统最高每天承载了亿级用户的高并发访问.那段日子,很苦很累 ...
- 去哪儿网机票搜索系统的高并发架构设计(2017-03-20 蒋志伟)
作者| 蒋志伟 编辑| Gary "高并发"一直是大家感兴趣的话题.2010年~2012年,我曾在Qunar供职,主要负责机票搜索相关的业务,当时我们的搜索系统最高每天承载了亿级用 ...
- 机票搜索高并发架构设计
去哪儿网机票搜索系统的高并发架构设计 转载 2017年05月11日 11:25:51 查看全文 http://www.taodudu.cc/news/show-3183758.html 相关文章: P ...
- 网易考拉海购:电商高并发架构设计的铁律
原文地址:https://blog.csdn.net/wangyiyungw/article/details/80350279 网易考拉海购已顺利度过了 2017 年的双十一.双十二等大促活动,销售额 ...
- 大型网站分布式高并发架构设计
1前言 网站架构包括:前端架构+应用层架构+服务层架构+存储层架构+后台架构+数据中心机房架构+安全架构+数据采集与监控. 以下为大型网站的一些架构: 2前端架构 浏览器优化技术 并不是优化浏览器,而 ...
- 火爆背后的挑战:直播平台的高并发架构设计
兴起及现状 日常生活用手机来看视频的次数越来越多,时间越来越长,看的内容也是种类越来越多.包括最近从3月份美国开始火起来之后,国内也在火的移动视频社交类.这个也是我们现在在重点切的一个垂类,这个垂类为 ...
- 5000并发的qps是多少_高并发架构设计
点击蓝字,关注我们 01 概述 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求. 高并发一方面可以提高资 ...
- [转]火爆背后的挑战:直播平台的高并发架构设计
文章来源:http://mt.sohu.com/20160606/n453247132.shtml 对技术人来说,火爆即是高并发的代名词.越是火爆的平台,对架构.负载容量的要求越高.挑战常在,怎么应战 ...
- 直播平台的高并发架构设计
兴起及现状 日常生活用手机来看视频的次数越来越多,时间越来越长,看的内容也是种类越来越多.包括最近从3月份美国开始火起来之后,国内也在火的移动视频社交类.这个也是我们现在在重点切的一个垂类,这个垂类为 ...
最新文章
- (C++)1046 划拳
- 百度推ACE交通引擎:不仅是无人车,车路协同新基建我也包了
- Windows Server 2008 R2 做开发需要开启那些角色和组件
- vtun 接收和发送数据流程图
- qpython怎么用matplotlib_将matplotlib绘图嵌入pyqt的方法示例
- 图文并茂的讲解 ICMP (网际控制报文)协议
- SAP Spartacus cxFocus增添了refresh Focus功能后的一些考虑
- SAP Spartacus 中 Angular json pipe 的工作原理
- 二叉树的基本操作及应用(三)
- Apollo进阶课程㉑丨Apollo规划技术详解——Basic Motion Planning and Overview
- input 对伪元素(:before :after)的支持情况
- 未能找到文件“\bin\roslyn\csc.exe”
- 基于Java的图书管理系统
- 屏幕录像软件使用教程?
- 如何配置属于自己的代理池
- 医院信息化建设,产品规划要求​
- Linux内核子系统---内存管理子系统、进程管理子系统
- 《数学之美》--吴军
- OC block的回环引用
- 11月最新非主流男生混搭头像一组_我的爱不再能分给你
热门文章
- 中国麒麟菜养殖产业发展现状分析,产量下降进口量上升「图」
- Android Retrofit★
- MQTT构筑运营平台与游戏端的交互通道
- ESP32设备驱动-TSL2561亮度传感器驱动
- 物联网专科专业必修课程_物联网工程专业主要课程大纲
- caxa工程知识管理服务器配置信息怎么填,CAXA CAPP教程:如何使用知识库填写卡片...
- 友基s400手写板怎么安装_电脑手写板安装步骤 手写板怎么用
- 轻量级网络:Bottleneck结构(沙漏型结构)
- 达人评测 i5 13400F对比i5 12490F选哪个好
- 实时聊天软件常用架构