联系
Knight's Tale » 架构

架构系列之:航线查询服务架构

2014-07-10 21:06

今天跟大家分享一个航线查询服务的架构。

业务场景

业务场景是这样的,输入 时间和航线 ,要求输出所有航班的排名。

这些航班数据均是第三方代理提供的。所有第三方代理的数据汇总便是结果。结果要细粒度到哪个航空公司哪架飞机的指定座位的价格信息。

架构

航线服务汇总服务

它接受Web的请求,它将汇总所有第三方代理的航班信息结果总和,并进行Rank。

部署时,它应该有N台。

注意:这里在接受Web请求时需要有Cache,避免重复数据处理,给下游带来压力。

它下面有N台的航线服务。这些航线服务各自代表着不同的第三方代理服务。

(第一步)航线服务汇总服务 通过 SOA,并通过一致性Hash算法 将请求负载均衡的发给指定的 航线服务。获取指定的航线信息。

航线服务

部署时,每个代理商M台,总共有X*M(X是代理商的数量)台。

接受 航线汇总服务 的请求,它会请求 第三方代理(第二步),获取相关的航线信息。这些信息都是未处理过的。然后将这些结果放到队列里(第三步)。然后返回空给 航线服务汇总。也就是说,结果不会马上返回,这个过程是异步的。

注意:这里第二步,也需要进行Cache,避免重复的对第三方代理带来压力。

接着,有几个线程不断地从队列里获取数据进行处理,处理完之后,通过订阅通知 航线服务汇总(第五步),并将结果放到Memcache中(第四步)。

注意:线程在处理数据时,需要具有判断是否数据已经处理过的能力,避免重复处理。

航线服务汇总 在获得订阅通知后,从Mecache中获取指定的数据。

注意:尽管请求航线服务本身是异步的,但其实也应该区别看待:

  1. 如果此航线信息已经计算完成,则 航线服务 就应该Cache住此数据,并同步的返回(第一步)
  2. 如果此航线信息还没有计算(Cache中无此数据),那么,可以采用异步来做。

需要说明的

对于搜索Query类型的服务架构,缓存的考虑就相当的重要了。