系统设计:全局缓存和一致性
System Design: Global Caching and consistency
让我们以推特为例。有一个经常更新的巨大缓存。例如:如果人 Foo 发推文并且它在全球范围内都有追随者。理想情况下,所有 PoP 中的所有缓存都需要更新。即他们应该保持同步
跨数据中心 (PoP) 的复制如何用于实时缓存?
什么 tools/technologies 是首选?
此系统设计中存在哪些潜在问题?
我不确定是否有 right/wrong 答案,但这是我的两便士价值。
我会从一个稍微不同的角度来解决这个问题:当用户发布某些内容时,该内容会进入分布式存储(不一定是缓存),该存储已经在多个地区变得冗余。我还假设,为了性能,这些节点最终是一致的。
现在是缓存。我不会设计一个系统来负责在每次有人做某事时同步所有缓存。我宁愿在服务级别实现缓存。想象一个小型服务驻留在一个地理分布的集群中。每次用户尝试获取数据时,该服务都会检查其本地缓存 - 如果未命中,它会从存储中读取推文并将其中的一部分放入缓存中(受驱逐政策约束)。所有后续访问(如果有)都将缓存在本地级别。
在设计注意事项方面:
- 仔细考虑DC/AZ拓扑,以确保足够的带宽和低延迟
- 在本地缓存以避免无用的网络传输
- 缓存更新不会从中心到外围发生;缓存未命中时创建缓存
- 我在这里说的很明显,实施正确的逐出策略以便在缓存中只保留正确的对象
- 唯一应该从中心到外围的消息是缓存刷新广播(告诉所有节点摆脱它们的缓存)
我当然遗漏了很多其他东西,但希望这是值得深思的。
让我们以推特为例。有一个经常更新的巨大缓存。例如:如果人 Foo 发推文并且它在全球范围内都有追随者。理想情况下,所有 PoP 中的所有缓存都需要更新。即他们应该保持同步
跨数据中心 (PoP) 的复制如何用于实时缓存? 什么 tools/technologies 是首选? 此系统设计中存在哪些潜在问题?
我不确定是否有 right/wrong 答案,但这是我的两便士价值。
我会从一个稍微不同的角度来解决这个问题:当用户发布某些内容时,该内容会进入分布式存储(不一定是缓存),该存储已经在多个地区变得冗余。我还假设,为了性能,这些节点最终是一致的。
现在是缓存。我不会设计一个系统来负责在每次有人做某事时同步所有缓存。我宁愿在服务级别实现缓存。想象一个小型服务驻留在一个地理分布的集群中。每次用户尝试获取数据时,该服务都会检查其本地缓存 - 如果未命中,它会从存储中读取推文并将其中的一部分放入缓存中(受驱逐政策约束)。所有后续访问(如果有)都将缓存在本地级别。
在设计注意事项方面:
- 仔细考虑DC/AZ拓扑,以确保足够的带宽和低延迟
- 在本地缓存以避免无用的网络传输
- 缓存更新不会从中心到外围发生;缓存未命中时创建缓存
- 我在这里说的很明显,实施正确的逐出策略以便在缓存中只保留正确的对象
- 唯一应该从中心到外围的消息是缓存刷新广播(告诉所有节点摆脱它们的缓存)
我当然遗漏了很多其他东西,但希望这是值得深思的。