知识卡片

主动牺牲性能换取幂等性与失效转移的正确性

普通读书笔记卡

内容

在[[任务分片与弹性扩容缩容的重分片机制]]描述的重分片过程中,分片重算是滞后到下次任务触发前才生效的,这意味着两次分片切换之间存在一个理论上的风险窗口:如果实现不当,同一个分片项有可能被错误地同时分配给两台服务器执行,或者某台服务器下线后它负责的分片项在本次执行中彻底”失踪”、没人处理。Elastic-Job用两个专门的功能应对这两种风险,并且都明确承认这些功能是以牺牲一部分性能为代价换来的:幂等性功能保证同一个分片项不会同时在两台服务器上运行——做法是给每个分片项维护运行状态,一旦某个分片项已经在运行,其他试图运行同一分片项的请求会被拒绝并等待状态变为非运行;失效转移功能则解决相反的问题——如果一台服务器在本次任务执行过程中下线,它原本分配到的分片项在本次执行里不会被重新分配(因为重分片要等到下次触发),失效转移功能让空闲的服务器主动去抓取这些”孤儿分片”来执行,避免这次任务的部分数据被彻底漏掉。这两个功能的共同价值在于揭示了一条分布式调度系统设计上的诚实态度:正确性(不重复执行、不遗漏执行)在分布式环境下几乎不可能零成本获得,与其假装某个设计”既快又对”,不如像这里一样明确承认”为了保证不重复、不遗漏,我们愿意在这些环节多付出一点性能开销”,把权衡摆在明处,而不是留下不被察觉的正确性漏洞。

参考来源

- 位置:《高可用架构(第1卷)》第2章《高可用架构原理与分布式实践》"2.6 新一代分布式任务调度框架:当当Elastic-Job开源项目的10项特性"节,"2.6.4 Elastic-Job包含的功能"(源文件:_epub-src/OEBPS/Text/Chapter2_6_5.xhtml) - 结论依据:原文说明"幂等性。Elastic-Job可牺牲部分性能用于保证同一分片项不会同时在2个服务器上运行"以及"失效转移功能可以在本次作业运行中用空闲服务器抓取孤儿作业分片执行。同样,失效转移功能也会牺牲部分性能",直接支撑本卡片结论。 - 原始内容:幂等性。Elastic-Job可牺牲部分性能用于保证同一分片项不会同时在2个服务器上运行……失效转移功能可以在本次作业运行中用空闲服务器抓取孤儿作业分片执行。同样,失效转移功能也会牺牲部分性能。