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

最终 , Uber使用了折衷的办法:使用读写锁来同步对地理位置索引的访问 。 为了最大程度地减少锁争用 , 在将新的索引段交换到主索引中以用于服务查询之前 , 会建立新的索引段 。 和StorePointer/LoadPointer方法相比 , 锁的使用导致查询等待时间略有增加 , 但是代码库的简单性和可维护性方面有了非常大的提高 。

经验总结

回顾整个案例 , 整个服务重构取得了很好的效果 , 并给予了很多启示:

提高了团队生产力和快速迭代 。 对于C++ , Java或Node.js开发人员来说 , Golang通常只需要几天的时间就可以上手 , Golang项目代码简便易于维护和实施部署 。

高吞吐量 , 低延迟 。 在主要数据中心 , 该服务用了40台运行35% CPU的计算机 , 峰值负载为170k QPS 。 响应时间极大缩短:95%服务请求响应时间不大于5毫秒 。 99%服务请求时间不大于50毫秒 。

超级可靠 。 自启动以来 , 该服务的正常运行时间为99.99% 。 唯一的故障是由初学者编程错误和第三方库中的文件描述符泄漏错误引起 。 Golang的运行时没有发现任何问题 。

推荐阅读