GH GambleHub

重复策略和等效性

1)为什么需要它

在网络中,故障是常态:计时器,瞬态错误,网络翻转,拥塞。只有在以下情况下,Retrai才能提高可靠性:

1.重复是安全的(等效的),

2.遵循重复之间的摘录,

3.尊重上瘾的限制/配额和"健康"。

目标是在业务运营级别上表现出effectively-once行为,而无需进行虚假的双打和比赛。

2)交付语义的分类法

最多:不重复、丢失风险(拼写、火灾和遗失)。
On-least-once:可能重复→需要消费者的平均水平(大多数队列,webhook)。
Effectively-once:复制是可能的,但重复数据消除是正确的(密钥、事务、outbox)。

3)何时撤回,何时不撤回

回溯是有道理的:'408','429'(遵守'Retry-After'),'425'(Too Early),'499'(client closed on the shirt),'5xx','504',网络定时/断裂,'502'在网关上,"connection reset"。
不重新定义请求:"400/ 401/403/404/422"。
有争议的案例:"409冲突"(通常不复制;首先阅读操作状态/重新确认意图)。

4)Taymauts,backoff和jitter

4.1规则

首先是定时,然后是转发:每个请求都应该有"最后期限"。
Exponential backoff: 'delay_n=base 2^n',限制'max_delay'。
Jitter具有约束力:为"钝同步波"的互换添加随机性。

4.2 Jitter模板

Full jitter: 'sleep=rand (0, base2^n)'是最佳整体选择。
Decorrelated jitter:"sleep=min(max_delay,rand(base,sleep_prev3))"-用于长时间对话。
Equal jitter: "sleep=base2^n/2+rand (0, base2^n/2)"是柔和的变化。

4.3 Retry-budget

限制回廊的份额:
  • `retry_budget_per_min = max(α success_rps, floor β)`;通常'α=0。1–0.2`.
  • 当预算用尽时-切换为fail-fast/circuit breaker "open"。

5)与rate限制和Circuit Breaker互动

尊重"Retry-After","RateLimit-Reset",并计入支持。
在高"5xh"/taymauts-下调retrae频率和总并发性。

Circuit breaker:

半场开放:允许有限的样本。
打开:立即拒绝(节省资源)。
Closed:通常的工作。
在写作操作中,最好以明确的线索返回409/503,而不是旋转激进的回程。

6)写作操作的幂等性

6.1总的想法

相同的意图→一个结果。基础是等容性的钥匙和执行记录的存储。

6.2个HTTP合同

客户端发送标题:

Idempotency-Key: 7a6b7f9e-2a46-4d0b-9c3a-2b30e1c3c9e3
Idempotency-Key-Expiry: 24h # optional
服务器:
  • 首次成功时,将保留(钥匙→结果,状态,身体哈希);
  • 重播时,返回以前的响应和标题"Idempotency-Replay:true";
  • 在身体冲突中(相同的钥匙,但不同的负载)是"409冲突"。

6.3存储和TTL

表/键值:'idempotency_key'、'request_hash'、'result'、'status'、'expiry_at'。
TTL=可能的重播和延迟交付窗口(通常为24-72小时付款)。
"idempotency_key"索引;对于高负载-散列哈希。

6.4示例模式(SQL)

sql
CREATE TABLE idempo_store (
key UUID PRIMARY KEY,
req_hash BYTEA NOT NULL,
status INT NOT NULL,
response JSONB NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
expiry_at TIMESTAMPTZ NOT NULL
);

6.5处理程序的伪代码

pseudo handle_write(req):
k = req. headers["Idempotency-Key"]
h = hash(req. body)
rec = idempo_store. get(k)

if rec and rec. req_hash == h:
return rec. status, rec. response, {"Idempotency-Replay": "true"}

if rec and rec. req_hash!= h:
return 409, problem("IDEMPOTENT_CONFLICT")

begin tx result = apply_business_mutation (req) # change status upsert once (idempo_store, key = k, req_hash=h, status = 201, response = result, expiry = now () + 2d)
commit

return 201, result

7)"effectively-once"模式"

Transactional Outbox:记录业务事件,并通过背景中继器从相同的DB事务发送消息;消费者是同等的。
消费者的收件箱/处理表:我们保留"event_id"以忽略配音。
Kafka上的exactly-once ≠业务上的exactly-once:即使在生产者/消费者的EOS中,应用逻辑仍然必须是偶然的。
补偿性事务(Saga):如果步骤中继并引起副作用,我们将系统恢复为不变。

8)私人案件: 付款和金融交易

Strong idempotency:密钥绑定到操作逻辑(例如'external_payment_id')。
在PSP上进行重复数据消除:存储"merchant_reference" →在重试时,PSP将返回以前的结果。
Retrai"来自客户":仅在"Idempotency-Key"中允许,否则可能会双重注销。
竞争性:执行期间的"帐户/工具/合同"锁定;重播时返回409/423。
可观察性:度量"idempo_replay_total","idempo_conflict_total"。

9)Webhooks和外部挑战

HMAC签名和时间窗口;首先检查,然后处理。
发件人转发:指数backoff+jitter,"max_attempts"和DLQ。
消费者-偶数:"event_id" →表/内存缓存;"整洁"的秩序不能保证。
代码:2xx=成功,4xx=不重复,5xx/taymout=重复。

10)队列和背景任务

缺省情况下,只有重复→是不可避免的。
存储"task_id"/"event_id"和运行时状态;双打-短路"replay"。
DLQ和poison-messages:尝试计数器、隔离、手动解析。
竞争性限制(信号)和偶发性锻炼者。

11)转化和"自然"钥匙

自然键(账号+日期+文件号)增强了对重复的抵抗力。
更改方桉/版本时,在"Idempotency-Key"或查询哈希中包含版本密钥。

12) HTTP标题和客户端提示

"Idempotency-Key","Idempotency-Replay","Retry-After","Prefer:wait=<sec>'(长期运营),'If-Match'/'ETag'(乐观锁定)。
409在密钥冲突中与有效的"Retry-After" 425/429/503。
对于"长"操作-接受异步状态("202接受"+"位置"到状态资源)。

13)测试和溷乱场景

Negative Test: 双发,重播与不同的身体,时钟旋转.

违反命令:"t2"早于"t1"。
注射Taymauts/"RST"/"EOF",半心半意查询(慢发)。
掉落的idempotency存储库→失败的封闭行为(故障优于双重注销)。

14)度量标准和Alertes

`retries_total{reason}`, `retry_budget_used{route}`, `backoff_seconds_bucket`.

`idempo_replay_total`, `idempo_conflict_total`, `duplicate_detected_total`.

路线上409/425/429/5xx的份额;p95/p99"成功的时间"。
Alerts: burn-rate retrais预算,水平冲突激增,DLQ增长。

15)反模式

连续重述所有错误。
缺乏抖动→同步回旋波。
长寿钥匙没有TTL和清洁。
在副作用(outbox干扰)commit后保存结果。
没有"trace_id"/"idempotency_key" →逻辑是不可能的。
在写作操作中具有攻击性的平行回程。

16)准备就绪支票清单

[……]单一政策:我们要回溯什么,不是什么;代码和提示客户端。

  • 指数backoff+full jitter;设置为"retry_budget"。
  • 合同'Idempotency-Key'+与TTL存储结果。
  • 事件的Outbox/Inbox;DLQ;竞争限制。
  • 与电路断路器集成,尊重"Retry-After"。
  • 度量/重复/冲突指标。
  • 溷沌测试套件和网络故障彷真。
  • 客户文档:后退示例和状态。

17) TL;DR

Retrai仅与幂等性一起使用。引入"Idempotency-Key"和结果存储库,应用带有抖动和背包的指数反冲,尊重"Retry-After",与电路断路器集成。对于事件-outbox/inbox;对于支付-严格的重复数据消除和锁定。测量复古和冲突,测试复制品和taymout。

Contact

联系我们

如需任何咨询或支持,请随时联系我们。我们随时准备提供帮助!

Telegram
@Gamble_GC
开始集成

Email — 必填。Telegram 或 WhatsApp — 可选

您的姓名 可选
Email 可选
主题 可选
消息内容 可选
Telegram 可选
@
如果填写 Telegram,我们也会在 Telegram 回复您。
WhatsApp 可选
格式:+国家代码 + 号码(例如:+86XXXXXXXXX)。

点击按钮即表示您同意数据处理。