为分布式系统设计可扩展的恢复服务

发布日期:2026-04-12 10:05:58   浏览量 :16
发布日期:2026-04-12 10:05:58  
16

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

故障是分布式系统中正常且可预期的一部分。

如果你的应用程序以异步方式处理数据——例如,通过消费 Kafka 消息或运行后台任务——那么故障会定期发生。某个服务可能会崩溃,下游依赖项可能会变得不可用,或者数据本身可能无法通过验证。

如果这些故障没有得到妥善处理,你的系统可能会丢失数据、产生重复数据,或者让你无法了解到底哪里出了问题。

本文介绍了一种简单而实用的方法,用于构建一个恢复服务,帮助你以可靠且可扩展的方式处理故障。

我们要解决什么问题?

在深入探讨之前,我们先澄清几个术语。

  • 事件或消息只是你的系统所处理的一个工作单元,例如一条 Kafka 消息。
  • 异步处理意味着这项工作是在后台完成的,而不是在用户请求中立即执行。
  • 当这种处理未能成功完成时,就发生了故障。
    在许多系统中,故障是通过立即重试来处理的。然而,这种方法在现实世界的系统中并不足够。

为什么简单的重试不够用

内存中的重试是有用的,但它们无法解决现实世界的问题:

  • 如果服务崩溃,所有正在进行的重试都会丢失。
  • 某些故障应该稍后再重试,而不是立即重试。
  • 没有持久化记录说明哪些任务失败了,以及它们被重试了多少次。
  • 没有明确的最终状态,这可能导致无休止的重试循环。

为了解决这些问题,必须将故障持久化并异步处理

什么是恢复服务?

恢复服务是一个负责处理失败工作的后台组件。

它执行三项主要功能:

  • 将失败的任务存储在数据库中。
  • 以受控的方式稍后重试这些任务。
  • 跟踪每个任务的最终结果。

系统不再立即重试,而是记录故障,并使用专门的工作进程稍后处理。

故障如何存储

每个故障都作为一条恢复任务存储在数据库表中。
一条恢复任务通常包含以下信息。

故障上下文

这包括关于什么发生故障的详细信息,例如事件类型和正在处理的有效载荷。

生命周期状态

这表示任务的结果,可以是以下几种之一:

  • FAILED,表示该任务正在等待重试
  • RESOLVED,表示该任务已成功恢复
  • PERMANENT_FAILURE,表示该任务将不再重试

重试元数据

这包括该任务已被重试的次数,以及下次应何时重试。

锁信息

这表明当前哪个工作进程正在处理该任务,以及锁是什么时候获取的。

重要设计原则:状态与锁是不同的

生命周期状态和执行锁代表的是不同的概念。

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部