跳到正文

租约

Lease

高级通用

租约(Lease)是带有有效期的临时使用权,常用来让一个服务实例暂时负责某项工作。它解决实例宕机后工作长期无人接手的问题;例如,处理队列任务的实例失联后,其他实例可以在租约过期后接手。

你可能会说:「多个服务实例抢同一批任务时,我想让一个实例先处理,掉线后别人还能接手。」

读之前建议先了解(这是一个高级概念)

动手看看

申请获准实例A持有租约租约记录有效期内实例B等待中图片任务
1

实例A先申请图片任务的租约。记录确认后,A只在有效期内拥有这项任务的处理权。

要点

  1. 1

    领取时一起记录到期时间

    你可以把租约理解成一张有期限的工作凭证。实例领取任务时,系统记录持有者和到期时间;只有领取成功的实例开始处理。这样多个实例同时抢任务时,就能先确定由谁负责。

  2. 2

    还在工作就定期续租

    任务可能比租约时间长,所以持有者通常会定期续租。续租时要核对它仍是当前持有者;如果进程卡住或网络断开,续租失败,租约到期后其他实例才有机会接手。

  3. 3

    过期不等于旧实例停手

    旧实例可能只是暂停后又恢复,它不知道自己的租约已经过期。如果它继续写入,就可能和新持有者冲突。对关键写入,可以让下游核对递增的租约编号,拒绝旧持有者的操作。

容易混淆的地方

租约和锁都能协调谁来操作,但锁不一定有期限;租约到期后,别人可以重新取得使用权。超时只是判断一段等待或操作是否太久,不会替你分配持有者。租约过期也不会自动终止旧实例的代码,所以涉及关键数据时,还要考虑旧实例恢复后继续写入的问题。

什么时候用

适合用

  • 网站有多个后台实例消费订单任务,想让单个任务暂时只由一个实例处理,实例失联后还能被接手。
  • 定时生成报表的服务部署了多个实例,想选出一个实例执行本轮任务,并在它宕机后重新分配。
  • AI 工具把长时间运行的文档处理任务分给工作进程,想在进程掉线后把未完成任务交给别人。

不适合用

  • 只是在单个进程内协调几段并发代码,不涉及跨实例接手,用进程内锁更直接。
  • 要保证一次数据库写入中多条记录同时成功或失败,靠租约做不到,用事务处理。
  • 只是想限制用户每分钟调用接口的次数,没有工作持有者需要选出,用速率限制更合适。

练一练

你做了一个多实例运行的图片处理服务。实例甲领取任务后卡住,租约到期;实例乙接手时,甲又恢复了。怎样设计更能避免两者同时写出最终结果?

让 AI 帮你做

请为多实例图片处理任务设计租约:领取和续租时校验当前持有者,租约到期后允许其他实例接手,并说明旧实例恢复后如何阻止它覆盖新实例的结果。请同时给出任务状态和失败重试的处理流程。

接下来学什么