同步不利于扩展

主要观点:

  • 分布式和单体系统中都存在需有序或同步执行的情况,多数同步需求源于系统需写入数据,单体系统常用互斥锁,但其不利于水平扩展,高并发系统中锁竞争会成为问题。
  • 以 Gubernator 为例,通过使用 S3-FIFO 缓存替代锁解决同步问题,测试中 S3-FIFO 优于 WorkerPool 实现,且只有在高 vCPUs 机器上才能看到明显改进。
  • 深入研究多 CPU 使用锁时的情况,通过 golang 中的 trace 工具可视化锁竞争对 CPU 的影响,无锁的锁自由共享缓存能更高效利用 CPU 资源。
  • 曾在 Mailgun 工作时开发分布式锁服务,因无法满足规模需求而放弃,介绍了 Mailgun 解决同步问题的多种方案,如跨多个表分散负载、一致哈希、预留队列、避免同步、Saga 模式等。
  • 数据库擅长同步,但同步会阻碍扩展,应避免将数据库作为同步点,如 Mailgun 通过在代码中创建同步点实现高效扩展,而某邮件竞争对手因依赖 PostgreSQL 进行所有同步导致架构问题。

关键信息:

  • 同步问题在分布式和单体系统中普遍存在,锁在不同系统中的作用及弊端。
  • Gubernator 中解决同步问题的方法及测试结果。
  • Mailgun 解决同步问题的多种策略及相关案例。
  • 数据库作为同步点的优缺点及相关示例。

重要细节:

  • golang 实现了 2 模式互斥锁,饥饿发生时会出现特定情况。
  • 跨多个 MongoDB 集合实现轮询读写可分散同步。
  • 一致哈希算法可分离同步点和存储。
  • 预留队列模式类似锁,可获得对数据的独占访问。
  • 避免将系统视为关系型数据库,拥抱最终一致性可减少对锁的需求。
  • 数据库同步会阻碍扩展,应避免将其作为所有同步的点。
阅读 10
0 条评论