本周系统设计复习:

  • 你应该知道的顶级 Kafka 用例
  • Uber 如何用集成 Redis 缓存服务 4000 万次读取?
  • 什么使 AWS Lambda 如此快?
  • 为什么我们需要使用分布式锁?

Uber 的 CacheFront 实现

实现有 3 个主要部分:

1. 带 CDC 的 CacheFront 读写

Uber 构建了 CacheFront - 一个与 Redis、Docstore 和 MySQL 集成的集成缓存解决方案。

  • 而不是微服务,Docstore 的查询引擎为读取请求与 Redis 通信
  • 对于缓存命中,查询引擎从 Redis 获取数据。对于缓存未命中,请求去存储引擎和数据库
  • 在写入情况下,Docstore 的 CDC 服务(Flux)使 Redis 中的记录失效。它跟踪 MySQL binlog 事件以触发失效

2. 使用 Redis 流的多区域缓存预热

区域故障转移可能导致缓存未命中并使数据库过载。

为处理这个问题,Uber 的工程团队使用跨区域 Redis 复制。这是通过跟踪 Redis 写入流以将键复制到远程区域完成的。

在远程区域,流消费者向查询引擎发出读取请求,查询引擎读取数据库并更新缓存。

3. Redis 和 Docstore 分片

Uber 的所有团队都使用 Docstore,一些团队生成大量请求。

Redis 和 Docstore 实例都分片或分区以处理负载。但单个 Redis 集群宕机可能创建热数据库分片。

为防止这个,他们使用与数据库分片不同的方案分区 Redis 集群。这确保负载均匀分布。

为什么 AWS Lambda 如此快?

有 4 个主要支柱:

1. 函数调用

AWS Lambda 支持同步和异步调用。在同步调用中,调用者直接使用 AWS CLI、SDK 或其他服务调用 Lambda 函数。在异步调用中,调用者不等待函数的响应。请求被授权,事件被放入内部 SQS 队列。轮询者从队列读取消息并发送它们进行处理。

2. 分配服务

分配服务管理执行环境。服务用 Rust 编写以获得高性能,并分为多个分区,采用领导者 - 追随者方法以获得高可用性。执行环境的状态写入外部日志。

3. Firecracker MicroVM

Firecracker 是轻量级虚拟机管理器,设计用于运行无服务器工作负载,如 AWS Lambda 和 AWS Fargate。它使用 Linux 的基于内核的虚拟机创建和管理安全、快速启动的 microVM。

4. 组件存储

AWS Lambda 还必须管理由输入数据和函数代码组成的状态。为使其高效,它使用多种技术:

  • 分块:更高效地存储容器镜像
  • 使用收敛加密:保护共享数据。这涉及向块附加额外数据以计算更强大的哈希
  • SnapStart 功能:通过预初始化执行环境减少冷启动延迟

分布式锁的 6 大用例

分布式锁是确保分布式系统中互斥的机制。

1. 领导者选举

分布式锁可用于确保在任何给定时间只有一个节点成为领导者。

2. 任务调度

在分布式任务调度器中,分布式锁确保计划的任务只由一个 worker 节点执行,防止重复执行。

3. 资源分配

当管理共享资源如文件系统、网络套接字或硬件设备时,分布式锁确保一次只有一个进程可以访问资源。

4. 微服务协调

当多个微服务需要执行协调操作时,如在不同数据库中更新相关数据,分布式锁确保这些操作以受控和有序方式执行。

5. 库存管理

在电商平台中,分布式锁可以管理库存更新,以确保当多个用户尝试同时购买同一商品时,库存水平准确维护。

6. 会话管理

当在分布式环境中处理用户会话时,分布式锁可以确保用户会话一次只由一个服务器修改,防止不一致。

本文为学习目的的个人翻译,译文仅供参考。

原文链接:EP131: How Uber Served 40 Million Reads with Integrated Redis Cache?

版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。