2006年,Redfin是第一家在地图上放置房屋的公司。这是甚至在谷歌地图是一个表演平台之前。他们在2008年迁移到谷歌地图之前,他们使用了Microsoft虚拟地球。这是普罗特施机的传奇成就,大量赋予购房者自己购物。从那以后,高质量的地图浏览一直是任何房地产购物工具的表格赌注。
进入Q2,Opendoor的地图正在具有性能问题。当用户在Phoenix中查看家园时,在地图上看到任何内容之前,它可能需要15秒。
在我们开始优化地图速度之前,我们需要弄清楚为什么它感到慢。经过一些与Chrome Dev Tools的分析,显而易见的是,对我们REST API进行了缓慢的调用来获取房产列表数据以在地图上显示。正在寻找DataDog向我们展示了这次大部分时间在ActiveModelserializers中花费并从DB获取。然后,我们构建了一个捕获用户疼痛的度量标准,我们想要解决:P90时间来获取地图的属性数据。我们使用第90个百分位数来捕获主要用户体验,同时排除异常值。
10.54s p90至< 1s p90优化发生在5份大约1个份:
我们使用Rails Active_Model_Serializers描述REST API将返回的字段。 Rails应用程序中的常见问题是用于多个端点的串行器,并且嵌入到包含多个使用情况所需的字段。这导致从我们的API和备用数据库中的数据过度取出(我们在MongoDB中存储列表)。我们还更新了我们的Mongoid查询以使用预测仅返回完成MongoDB的请求所需的数据。仅为地图组件创建专用序列化器并减少数据提取解决了这些问题,并让我们几乎是2倍的加速。
Rails应用程序中的常见问题是用于多个端点的串行器,并且嵌入到包含多个使用情况所需的字段。
在修复DB问题时,我们注意到,当前端请求未过滤的区域的属性列表时,我们注意到我们具有智能逻辑以缓存序列化属性列表。这是最常见的查询类型,因为它是用户在地图上登陆时的默认状态。不幸的是,在所有情况下,都会引入错误的错误。我们纠正了此行为,并在端点周围添加了集成测试,以确保填充缓存,然后按后的请求。延迟尖峰和缓存命中率的警报将捕获并标记我们以调查产品中的缓存系统故障(更详细信息)。
DataDog在我们的Serializers和Mongo之间表现出很多回圈。事实证明,通过在其中一个序列化程序字段中进行序列化属性列表,其中一个字段中的一个字段通过在其中一个序列化程序字段中添加了n + 1查询。在查询数据库的属性时,我们通过使用mongoid的包含()来完成此操作。优化查询,以便在序列化之前批量获取所有数据,以越来越几秒钟。
地图上的属性和列表中的属性都由相同的查询获取。如果属性出现在列表和地图中,则这是一个设计决策,使逻辑简单,并最小化有效载荷大小。分析显示有效载荷大小并不是一个问题,但每个列表都需要自己的CloudSearch和数据库查询。将这些分为两个与前端并行完成的两个单独的API调用是一场轻松的胜利,并且不需要任何在轨道中具有多线程的遇到。
我们的最终胜利完全来自避免了数据库。通常,我们从CloudSearch获取房产列表,然后用MongoDB的一些额外的字段来水合物。相反,我们将前端切换到仅期望纬度/经度点位置,并且如果有超过120个属性来显示纬度/经度点位置并显示群集。这意味着当点集群显示我们不必触摸MongoDB时,在我们做的情况下,它是少数属性和相对较快的。
最后一步是确保我们有一种捕获回归的好方法。虽然自动化测试对于在代码级别捕获错误时,警报很重要,因为微妙的配置更改可以在暂存环境中自动测试的方式打破分布式系统(如缓存)可能不会捕获。我们现在在有一个异常的延迟变化时由DataDog通知,并且我们有具有相关指标的有用仪表板。
因此,我们从家庭购物工具中看到了卓越的表现,并且可以更快地采用Opendoor-Backed优惠,这是一款支持我们买家的家庭优惠的产品,并在今天的热门市场中给予他们竞争优势。 Web和Mobile的性能工作是我和我的团队的首要任务。我们将继续将资源投入资源进入我们家庭购物工具,其目标是为客户提供最佳体验。
如果这种类型的作品听起来有趣,OpenDoor正在招聘!前往我们的职业生涯页面以了解更多信息。