Karrot(韩国的领先社区平台)将其原有的推荐系统替换为基于多种AWS服务的可伸缩架构,以解决旧系统在紧耦合、有限可扩展性和可靠性方面的问题,转而采用了构建在可伸缩云服务之上的分布式、事件驱动架构。
Karrot的推荐系统用于在首页为用户提供个性化内容,该系统包含推荐机器学习模型和一个特征平台,该平台充当用户行为历史和文章信息的数据存储。随着公司近年来的发展,增加新功能变得愈发困难,系统开始受限于可扩展性不足和数据质量不佳的问题,这主要源于特征存储和数据摄取过程的碎片化。
最初的推荐系统架构与二手市场Web应用紧密耦合,特征相关的代码是硬编码的。尽管该架构使用了如Amazon Aurora、Amazon ElastiCache和Amazon S3等可伸缩数据服务,但从多个数据源获取数据导致了数据不一致,并且在引入新的内容类型(如本地社区、工作和广告)时面临挑战。
Karrot的工程师强调了使用统一、灵活且可伸缩的特征存储的重要性:在基于机器学习的系统中,各种高质量的输入数据(如点击、转化行为等)被认为是关键要素,这些输入数据通常被称为特征。为了提升个性化推荐的准确性,需要多种类型的特征,一个能够高效管理这些特征并将其快速交付给ML推荐模型的系统至关重要。
公司为新的特征平台设定了雄心勃勃的目标,以支持未来的产品发展和流量增长。技术团队还明确了围绕服务与摄取流量、总数据量和最大记录大小的技术要求。
新架构概览
新架构主要涵盖三个领域:特征服务层、流式摄取管道和批处理摄取管道。
特征服务层负责向推荐引擎提供最新的特征数据。工程师们考虑了功能性和技术要求,设计了一个多级缓存解决方案,并针对不同特征特性制定了专门的服务策略:
- 小而高频使用的数据集,由位于特征服务器(运行在Amazon EKS Pod上)的内存缓存提供服务。
- 中等规模且使用频率合理的特征,从远程ElastiCache缓存中获取。
- 使用频率低且记录大的特征类型,则直接从采用统一模式的DynamoDB表中获取。
此外,团队还创建了一个专用的按需特征服务器EKS服务,用于处理动态计算或由于合规问题无法持久化的特征。
在构建服务层时,工程师们解决了几个常见的缓存挑战。他们采用了概率性提前过期(PEE)技术来刷新热门内容并主动应对缓存未命中,从而缓解缓存雪崩并改善延迟。他们还使用了带抖动的软硬TTL以及直写缓存来缓解一致性问题,并通过负缓存来减少不必要的数据库查询。
流式摄取管道作为特征平台改造的一部分,Karrot为实时事件和批处理模式创建了新的数据摄取架构。公司专注于其主流处理机制的简单ETL逻辑和验证,将更复杂的用例(如使用预训练模型创建内容嵌入或使用LLM丰富内容特征)留给定制解决方案处理。工程师结合使用了运行在EKS上的事件分发器和聚合器服务,从Amazon MSK获取事件,以高效处理事件与特征之间的M:N关系。
批处理摄取管道团队考虑过使用Apache Airflow,但最终出于简单性和成本效益的考虑,选择了在AWS Fargate上运行的AWS Batch进行批处理摄取。不过,工程师们后来也发现了几个需要改进的领域,包括缺乏DAG支持、手动配置并行处理以及监控有限。
成果与收益
得益于新平台,Karrot的文章推荐点击率提升了30%,转化率提高了70%。该新平台已被应用于超过10个不同的空间和服务,存储了跨众多服务和内容类型的超过1000个特征。
通过采用分布式缓存策略与精心设计的流批一体摄取管道,Karrot成功构建了一个支撑业务高速增长的现代化事件驱动架构核心组件。
|