在捕鱼送金币上无服务

照片是我们家居购物之旅中最重要的元素之一。搜索结果页面中显示的几乎80%的信息纯粹是视觉的。大约85%的用户互动与我们的移动应用程序中的捕鱼送金币库互动,我们每天收到数百万的点击次数。照片质量和分辨率的趋势在一天中不断改进,我们正在接收来自所有来源的更大和更优质的房屋信息。在Realtor.com,我们努力在所有面向消费者的UIS上快速捕鱼送金币显示高质量照片。为了继续实现这一目标,我们完成了一项主要的技术转型,以便无服务,这篇文章详情了我们的旅程。

拍摄者丹金uns

我们之前的捕鱼送金币处理

回到当天,我们曾经从遗留云堆栈进行处理和服务EC2在捕鱼送金币请求上飙升时,计算实例并依赖于自动缩放事件。这些实例非常慢,因为它需要几分钟来减轻对列表的捕鱼送金币更改的增加的延迟。实例的数量是常量的,当延迟没有改善时,需要再次增加。这对捕鱼送金币处理和显示延迟进行了另一个损害。

我们用了简单的工作流服务(或swf)与一组演员(解脱扬妇和工人)负责处理每日收到数百万的照片。我们使用SWF工作优先级首先进程新增的捕鱼送金币,以避免在高需求期间为新列表搜索出现的搜索结果上的照片。实施工作正常,但由于在可能需要15至60分钟的高峰期内捕鱼送金币变化的高延迟,具有一些缺点。所有这些缺点都导致我们无服务器,所有的捕鱼送金币处理都是显示和渲染的所有方式。

无服务器捕鱼送金币处理

移动到AWS阶段功能对我们来说是有道理的,因为它们与Lambda完美无瑕地为无刀编程工作流工作。但是,没有办法队列像SWF内部任务列表等捕鱼送金币作业。步进功能的模块化允许我们实现SQS队列作为模仿作业队列的状态机的一部分。我们能够为优先级与正常工作实施单独的队列。作为返回,我们从开始到结束时获得了对执行工作流程的更多控制。每次执行都分成较小的捕鱼送金币批量,并发送到这些SQS队列。每个批处理都包括一个任务令牌,以便我们部署在Lambda函数中的捕鱼送金币处理器可以通知状态机完成其完成。由于我们在单个执行中生成多批捕鱼送金币,因此通过使用地图状态进行之前完成所有批次。

AWS. Lambda有其限制和配额必须考虑。这些由地区强制执行。对于任何可能发生和触发击中配额的大量Lambda执行的随机方案,它会对使用Lambda的其他应用产生负面影响。这就是为什么我们在状态机中配置了在Lambda上运行的每个步骤,其中包含指定数量的并发执行屏蔽它影响其他服务。

除此之外,我们还通过切换到使用经典负载均衡器来迁移我们的API至无要的API网关加上lambda设置。这允许我们的系统支持更高的流量带宽和油门请求为了更好的吞吐量。

无服务器捕鱼送金币呈现

一旦从捕鱼送金币处理系统处理了捕鱼送金币,它会通过我们的捕鱼送金币托管服务生成一个捕鱼送金币URL,提供动态捕鱼送金币操作和渲染功能,例如调整大小,裁剪,面部识别等。由于我们的所有客户UI都以各种显示尺寸观看,因此我们巩固了少数标准捕鱼送金币尺寸,这些尺寸全部动态生成并存储在我们的CDN上以进行快速交付。

我们之前的捕鱼送金币托管服务使用了第三方CDN,它依赖于计算实例,如我们之前的捕鱼送金币处理系统。最初,我们认为由于高流量,在EC2实例上运行这一点仍然是更有成本效益的。我们试图使用前一堆堆栈将CDN切换到不同的提供商,但由于发布后的成本高,因此我们最终结束。

The failed launch brought us back to the drawing board. We decided to move everything to serverless including our image URLs. We moved our system to a regional-type Lambda function and integrated this with API Gateway. We tried Lambda@Edge as well but the cost implications end up still more expensive than the legacy setup. In our old stack, we used a third party CDN that required us to incur cost from the traffic on our NAT gateway. In this new system, we integrated everything fully within the AWS platform to nullify those charges.

我们使用与我们尝试的其他CDN不同的CloudFront CDN不同。我们重新配置并重建了我们的预订服务到无要。我们在北美的三个地区预装了我们的捕鱼送金币。基于清单位置,我们将捕鱼送金币预订到最近的区域。这种情况提高了我们的性能,同时为具有非常低的延迟提供的捕鱼送金币。在卷展栏期间,我们在整个美国的所有捕鱼送金币中加速了所有捕鱼送金币,使得开关将更加光滑,避免击中Lambda并发性限制.

小调整,巨大的改进

我们还有一些调整,作为这项工作的一部分也应该注意到。

  • 我们重新格式化了我们的捕鱼送金币URL,以便如果在列表的一组捕鱼送金币中已经存在相同的捕鱼送金币,则不会生成新的捕鱼送金币资产。这样,如果捕鱼送金币重新排序(涵盖我们每日捕鱼送金币摄入的20%),我们可以重复使用相同的捕鱼送金币数据和缓存,这会增加我们的缓存命中率并降低成本。
  • 我们切换了我们的成像库枕头SIMD它比使用turbojpeg的枕头掌握速度快。
  • 除了在我们的CloudFront CDN配置中的所有三个地区静止地重用捕鱼送金币,而不是将捕鱼送金币静止,而是确定了列表的地理位置,并将捕鱼送金币重新处理到适当的区域。这有助于平均提高30ms的捕鱼送金币渲染的缓存效率和响应捕鱼送金币延迟。
  • 我们也接受了支持媒介同样产生33%的文件大小,导致显着节省了 带宽和移动数据使用情况。我们在最新版本的我们的Android应用程序和浏览器中启用了此功能,支持WebP,例如Chrome和最新版本的Firefox。
  • 在我们对新系统的迁移过程中,我们将在切换之前将所有捕鱼送金币资产重新处理到新CDN。我们重建了我们的预订系统,无论如何,为所有活动捕鱼送金币资产运行它,以便CDN开关将是无缝的。在过去,这是我们在轰炸我们的捕鱼送金币服务器时争取了更新的地方,因为我们将从一个带空缓存的新CDN开始

少即是多

启动后,我们的捕鱼送金币处理端到端现在在高峰时段期间实现8-15秒的平均延迟。这是从16-60分钟的下降。下面的图表在每天处理超过8000千万的捕鱼送金币时,平均值从800K到10ms下降。我们能够通过无服务方法将处理成本降低约10%。

我们的捕鱼送金币渲染和显示通过2x改善调整性能大小。我们以前的调整大小性能平均延迟160ms,而新系统平均仅需90毫秒。在我们的预缓存服务中迁移到新系统后,我们还看到了显着的改进,该服务将延迟超过2,000到800秒,然后在移动到无服务方法后400秒以下。

由于我们的预订比以前的设置更有效且更快,因此我们的应用程序和客户端UI上的所有捕鱼送金币请求都会花费30毫秒的响应时间。此外,我们的新平均缓存命中率为87%,我们只在上一个系统中击中75-79%。最终,新系统的整体成本比上一个少30%。

我们纯粹的无服务融合之旅的整个经验都有一些障碍,要求我们重新思考如何以更简单,更可管理和可扩展的方式进行更快的处理时间和较低的基础设施成本。我们的AWS支持团队在整个课程中非常帮助我们,并能够提供有关预计成本的良好估计。总而言之,我们实现了我们的目标,我们很自豪地说,Realtor.com上的所有列表捕鱼送金币都是免费服务的!

发表评论

您的电子邮件地址不会被公开。必需的地方已做标记*