Uber利用Golang构建高性能地理查询服务实践( 二 )

地理围栏是指地球表面上人类定义的地理区域(或几何学上的多边形) 。 Uber服务中广泛使用了地理围栏为基础的CIS服务 。 具体表现为向用户显示在给定位置提供哪些服务 , 定义具有特定要求的区域(例如机场)以及对许多人同时打车的地点实施动态定价等 。 比如下面是一个地理围栏的示意图:

从用户的手机中检索纬度/经度之类的东西的基于地理位置的服务基础是找到该位置所属的地理围栏 。 在Uber初始版本的服务中该功能简单的在多个服务/模块中复用 。 在进行微服化后该服务功能被集中到一个新的微服务 。

起步

在评估语言时 , Uber考虑了Node.js和Golang 。 前者是实时产品团队的主要编程语言 , 对该语言的成员比较熟悉 , 而且有大量的项目经验积累 。 但是最终还是选择了Golang , 主要考虑了一下的因素:

首先 , 性能上要求高吞吐量和低延迟 。 基本上Uber移动应用程序的每个请求都需要地理围栏查询 , 并且必须能快速响应结果(99%响应不得大于100毫秒) , 查询的QPS要达到100000次 。

推荐阅读