2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家
故障是分布式系统中正常且可预期的一部分。
如果你的应用程序以异步方式处理数据——例如,通过消费 Kafka 消息或运行后台任务——那么故障会定期发生。某个服务可能会崩溃,下游依赖项可能会变得不可用,或者数据本身可能无法通过验证。
如果这些故障没有得到妥善处理,你的系统可能会丢失数据、产生重复数据,或者让你无法了解到底哪里出了问题。
本文介绍了一种简单而实用的方法,用于构建一个恢复服务,帮助你以可靠且可扩展的方式处理故障。
我们要解决什么问题?
在深入探讨之前,我们先澄清几个术语。
- 事件或消息只是你的系统所处理的一个工作单元,例如一条 Kafka 消息。
- 异步处理意味着这项工作是在后台完成的,而不是在用户请求中立即执行。
- 当这种处理未能成功完成时,就发生了故障。
在许多系统中,故障是通过立即重试来处理的。然而,这种方法在现实世界的系统中并不足够。
为什么简单的重试不够用
内存中的重试是有用的,但它们无法解决现实世界的问题:
- 如果服务崩溃,所有正在进行的重试都会丢失。
- 某些故障应该稍后再重试,而不是立即重试。
- 没有持久化记录说明哪些任务失败了,以及它们被重试了多少次。
- 没有明确的最终状态,这可能导致无休止的重试循环。
为了解决这些问题,必须将故障持久化并异步处理。
什么是恢复服务?
恢复服务是一个负责处理失败工作的后台组件。
它执行三项主要功能:
- 将失败的任务存储在数据库中。
- 以受控的方式稍后重试这些任务。
- 跟踪每个任务的最终结果。
系统不再立即重试,而是记录故障,并使用专门的工作进程稍后处理。
故障如何存储
每个故障都作为一条恢复任务存储在数据库表中。
一条恢复任务通常包含以下信息。
故障上下文
这包括关于什么发生故障的详细信息,例如事件类型和正在处理的有效载荷。
生命周期状态
这表示任务的结果,可以是以下几种之一:
-
FAILED,表示该任务正在等待重试 -
RESOLVED,表示该任务已成功恢复 -
PERMANENT_FAILURE,表示该任务将不再重试
重试元数据
这包括该任务已被重试的次数,以及下次应何时重试。
锁信息
这表明当前哪个工作进程正在处理该任务,以及锁是什么时候获取的。
重要设计原则:状态与锁是不同的
生命周期状态和执行锁代表的是不同的概念。
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。
