本周系统设计复习:
- 你应该知道的顶级 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?。
版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。