后台搜索
后台搜索系统的核心任务是从外部的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)来管理这些异步任务。具体实现以下:
具体原理:按照每一个GDS服务器稳定性(经过轮休方式,不断Check它们的可用性)和查询性能,咱们算出一个合理的权重,给它分配对应的一组虚拟的Node节点,这些Node节点由一个Node池统一管理。这样,不一样的GDS系统都抽象成了资源池里面的一组相同的Node节点。
那么它具体如何运转的呢?
当缓存系统相关航班数据过时后,前台搜索告知MQ有实时搜索任务,MQ统一把异步任务交给Router,这个时候Router并不会直接请求GDS数据,而是去找Node池。Node池会动态分配一个Node节点给Router,最后Router查找Node节点映射的GDS,而后去请求数据,最后异步更新对应的缓存数据。经过技术的实现,咱们把哪些不稳定的,甚至半瘫痪的GDS充分利用了起来(包含付费的一种黑屏终端,咱们把它用成了免费模式,这里用到了某些黑科技,政策缘由不方便透露),同时知足了前台上亿次搜索查询!
监控系统
鉴于机票系统的复杂度和大业务量,完备监控是很必要的:
一、整个Qunar系统架构层级复杂,第三方服务调用较多(譬如GDS),早期监控系统基于CACTI+NAGIOS ,CACTI有很丰富的DashBoard,能够多维度的展现监控数据。除此之外,公司为了保证核心业务快速响应,埋了不少报警阈值。并且Qunar还有一个NOC小组,是专门24小时处理线上报警:记得当时手机天天会有各类系统上百条的报警短信。
二、复杂系统来源于复杂的业务,Qunar除了对服务器CPU、内存、IO系统监控之外,远远是不够的。咱们更关心,或者说更容易出问题是业务的功能缺陷。因此,为了知足业务须要,咱们当时研发了一套业务监控的插件,它的核心原理以下图:
它把监控数据先保存到内存中,内部定时程序每分钟上传数据到监控平台。同时它做为一个Plugin,能够即插即用。接入既有的监控系统,它几乎实时作到监控,设计上也避免了性能问题。后期,产品、运营还基于此系统,作数据分析和预测:好比统计出票正态分布等。由于它支持自定义统计,有很方便DashBoard实时展现。对于整个公司业务是一个颇有力的支撑。
转载地址:http://mp.weixin.qq.com/s/1ipdByfsaTcHpo_W5gJVug