Uber 一开始是单体架构,后来逐渐演化为面向服务的架构。Uber 最早只为旧金山提供服务,他们称之为 UberBlack。后来随着核心领域模型的增长以及引入了越来越多的新特性,组件的耦合非常严重,持续集成变成了沉重的负担,每次部署都意味着需要一次性部署所有的东西。在单一代码库中添加新功能、修复 bug、解决技术债务变得非常困难,这也是为什么 Uber 后来采用面向服务的架构的原因,这也促使 Uber 工程团队重构了新的 Uber 应用。
新应用程序增加了 UberPool、预约出行和促销车辆的视图。
功能性需求
调度优化(或称 DISCO,Dispatch optimization)是 Uber 系统的一部分,用于基于位置数据匹配需求和供给。在匹配司机和乘客时,DISCO 保持最小化总服务时间和驾驶时间。与简单地使用纬度和经度来定位乘客和司机不同,DISCO 使用了更精确的谷歌 S2 库,它将地图划分为多个小单元。例如根据需求,可以在地图上设置 1 平方公里的单元格,每个单元分配唯一的 ID,因此在分布式系统中可以通过 ID 更方便的存储和访问单元数据,并且可以使用一致性哈希来存储单元数据。
调度系统基于 NodeJS 实现,提供基于事件的异步机制,允许在任何时候通过 WebSocket 和应用程序进行交互。Uber 使用一致性哈希环来扩展其 DISCO 服务器,从而在服务器之间有效分配负载,并自动检测集群中是否有新节点被添加或是否有节点从集群中移除,从而通过 SWIM/Gossip 协议重新分配工作负载。服务器之间通过 RPC 进行通信。
最后,
大数据是一个必须要发展的更好的解决方案。
出处:https://xie.infoq.cn/article/c7c4c0fb77b70d1ea3c8c5e0b