GH GambleHub

이념과 키

demempotency 란 무엇입니까?

Idempotency는 동일한 식별자로 반복하면 최종 효과가 변경되지 않는 작업의 속성입니다. 분산 시스템에서 이것은 배상, 중복 메시지 및 타임 아웃에도 불구하고 결과를 "정확히 하나의 처리" 와 동등하게 만드는 주요 방법입니다.

핵심 아이디어: 잠재적으로 반복 가능한 각 작업에는 시스템이 "이미 완료되었습니다" 를 인식하고 결과를 두 번 이상 적용하는 키가 표시되어야합니다.

중요한 곳

결제 및 잔액: 'operation _ id' 별 상각/크레딧.
예약/인용문/제한: 동일한 슬롯/리소스.
웹 후크/알림: 반복 전달이 효과를 복제해서는 안됩니다.
가져오기/마이그레이션 - 파일/패키지를 다시 실행합니다.
스트림 처리: 브로커/CDC에서 복제합니다.

키의 종류 및 범위

1. 운영 키-비즈니스 거래의 특정 시도 ID

예: 'deidempotency _ key' (HTP), 'operation _ id' (RPC).
범위: 서비스/집계; 중복 제거 테이블에 저장됩니다.

2. 이벤트 키-이벤트/메시지의 고유 식별자

예: '이벤트 _ id' (UUI), '(producer _ id, sequence)'.
지역: 소비자/소비자 그룹; 투영을 보호합니다.

3. 비즈니스 키-자연 도메인 키

예: 'payment _ id', 'invice _ number', '(user _ id, day)'.
영역: 집계; 독창성/버전 검사에 사용됩니다.

💡 종종 함께 사용됩니다: 'operation _ id' 는 명령, '이벤트 _ id' - 전달, '비즈니스 키' -집계의 불변을 보호합니다.

TTL 및 보존 정책

TTL 키는 가능한 재실행 창: 로그 보존 + 네트워크/프로세스 지연.
중요한 도메인 (결제) TTL - 일/주; 원격 측정-시간.
배경 작업이있는 깨끗한 디드 업 테이블; 감사-아카이브.

키 저장소 (중복 제거)

거래 데이터베이스 (권장): 안정적인 업저트/고유 인덱스, 효과가있는 공동 트랜잭션.
KV/Redis: 짧은 TTL에는 빠르고 편리하지만 OLTP와의 공동 거래는 없습니다.
스테이트 스토어 스트림 프로세서: 중개인의 로컬 + 변경 로그; Flink/KStreams에 좋습니다.

다이어그램 (DB의 옵션):
  • (PHP 3 = 3.0.6, PHP 4)

'savior _ id' (и독자적인 '서비스'), 'op _ id' (PK не .

색인: '(소비자 _ id, op _ id)' -고유.

기본 구현 기술

1) 효과 + 진행 거래

한 트랜잭션에서 결과를 기록하고 읽기/위치 진행 상황을 캡처하십시오

pseudo begin tx if not exists(select 1 from idempotency_keys where consumer=:c and op_id=:id) then
-- apply effect atomically (upsert/merge/increment)
apply_effect(...)
insert into idempotency_keys(consumer, op_id, applied_at)
values(:c,:id, now)
end if
-- record reading progress (offset/position)
upsert offsets set pos=:pos where consumer=:c commit

2) 최적의 동시성 (단위 버전)

경주 할 때 이중 효과로부터 보호합니다

sql update account set balance = balance +:delta,
version = version + 1 where id=:account_id and version=:expected_version;
-- if 0 rows are updated → retry/conflict

3) Idempotent 싱크 (upsert/merge)

Accrue 한 번:
sql insert into bonuses(user_id, op_id, amount)
values(:u,:op,:amt)
on conflict (user_id, op_id) do nothing;

프로토콜의 이념성

HTT/REST

'Idempotency-Key: <uq' hash> '헤더.
서버는 키 레코드를 저장하고 동일한 응답을 다시 반환합니다 (또는 충돌이 발생하지 않는 경우 코드 '409 '/' 422').
"안전하지 않은" POST의 경우 'Idempotency-Key' + 안정적인 타임 아웃/리트레이 정책이 필요합니다.

gRPC/RPC

메타데이터 'dedempotency _ key', '요청 _ id' + 마감일.
REST에서와 같이 서버 구현: 트랜잭션의 중복 제거 테이블.

중개인/스트리밍 (Kafka/NATS/Pulsar)

프로듀서: 안정적인 '이벤트 _ id '/idempotent 프로듀서 (지원되는 위치).
소비자: '(소비자 _ id, 이벤트 _ id)' 및/또는 비즈니스 버전의 집계에 의한 결제.
비정규/손상 메시지에 대한 별도의 DLQ.

웹 후크 및 외부 파트너

계약에서 'Idempotency-Key '/' 이벤트 _ id' 수요; 재배송은 안전해야합니다.
'알림 _ id' 를 저장하고 상태를 보내십시오. 다시 트레이에서-복제하지 마십시오.

키 디자인

결정 론적: 배상은 동일한 키를 보내야합니다 (클라이언트/오케 스트레이터에서 미리 생성).
범위: 'op _ id' 를 '서비스: 집계: id: 목적' 으로 구성하십시오.
충돌: UUIDv7/ULID를 사용하거나 비즈니스 매개 변수의 해시 (필요한 경우 소금 포함) 를 사용하십시오.
계층 구조: → 전면의 일반적인 'operation _ id' 는 모든 하위 작업 (demempotent chain) 으로 변환됩니다.

UX 및 제품 측면

반복되는 키 요청은 동일한 결과 (본문/상태 포함) 또는 명시 적 "이미 실행" 을 반환해야합니다.
"행운을 위해" 다시 시도하는 대신 상태 "작업이 처리/완료되고 있음을 사용자에게 보여줍니다.
긴 작업의 경우-키 별 폴링 ('GET/operations/{ op _ id}').

관찰 가능성

로그 'op _ id', 'event _ id', 'trace _ id', 결과: 'APPLIED '/' ALREADY _ APPLIED'.
메트릭: 반복 속도, 테이블 크기, 트랜잭션 시간, 버전 충돌, DLQ 속도.
추적: 키는 명령 → 이벤트 → 투영 → 외부 호출을 통과해야합니다.

안전 및 준수

키에 PII를 저장하지 마십시오. 키 - 페이로드가 아닌 식별자.
긴 TTL을 사용하여 중복 제거 레코드의 암호화 민감성 필드.
보존 정책: TTL 및 아카이브; 응답/메타 데이터의 암호화 소거를 통해 잊어 버릴 권리 (PII가 포함 된 경우).

테스트

1. 복제: 하나의 메시지/요청 2-5 회 실행-정확히 하나의 효과.
2. 단계 간 드롭: 효과 기록 전/후, 오프셋 수정 전/후에.
3. 소비자 재시작/재조정: 이중 사용 없음.
4. 경쟁: 하나의 'op _ id' → 하나의 효과가있는 병렬 쿼리, 두 번째- 'ALREADY _ APPLIED/409'.
5. 수명이 긴 키: TTL 만료를 확인하고 복구 후 다시 시도하십시오.

반 패턴

각 리트레이에 대한 임의의 새 키: 시스템은 리플레이를 인식하지 못합니다.
두 가지 별도의 커밋: 먼저 효과, 오프셋-그들 사이의 추락은 효과를 복제합니다.
중개인 만 신뢰하십시오: 타박상/골재에 중복 제거 없음.

집계 버전이 누락되었습니다. 반복되는 이벤트 변경 사항이 두 번째로 상

지방 키: 키에는 비즈니스 필드/PII → 누출 및 복잡한 색인이 포함됩니다.

반복 가능한 응답 없음: 클라이언트가 안전하게 철회 할 수

지불 POST

고객: 'POST/payment' + 'Idempotency-Key: k-789'.
서버: 트랜잭션-' 결제 '및' demempotency _ keys '항목을 만듭니다.
다시 시작: 동일한 '201 '/본문을 반환합니다. 변하지 않는 갈등의 경우- '409'.

보너스 발생 (싱크)

sql insert into credits(user_id, op_id, amount, created_at)
values(:u,:op,:amt, now)
on conflict (user_id, op_id) do nothing;

이벤트에서 투영

소비자는 장치의 '보이는 (이벤트 _ id)' 및 '버전' 을 저장합니다. 반복-무시/idempotent upsert.
읽기 진행 상황은 프로젝션 업데이트와 동일한 거래에서 캡처됩니다.

생산 체크리스트

  • 모든 안전하지 않은 작업에는 dempotent 키가 있으며 범위가 정의되어 있습니다.
  • TTL과 고유 인덱스가있는 중복 제거 테이블이 있습니다.
  • 독서의 효과와 진행은 원자 적으로 이루어집니다.
  • 낙관적 경쟁 (버전/시퀀스) 이 쓰기 모델에 포함되어 있습니다.
  • API 계약은 'Idempotency-Key '/' operation _ id' 및 반복 동작을 캡처합니다.
  • 메트릭 및 로그에는 'op _ id '/' event _ id '/' trace _ id' 가 포함됩니다.
  • CI에서 중복, 낙하 및 인종에 대한 테스트.
  • TTL/아카이브 정책 및 PII 보안이 준수됩니다.

FAQ

'Idempotency-Key' 는 'Request-ID' 와 어떻게 다릅니 까?
'요청서' - 추적; 배반시 변경할 수 있습니다. 'Idempotency-Key' 는 반복 중에 동일해야하는 작업의 의미 론적 식별자입니다.

데이터베이스없이 demempotence를 수행 할 수 있습니까?
짧은 창 (예: Redis/in-process cash) 의 경우 공동 트랜잭션이 없으면 중복의 위험이 증가합니다. 중요한 도메인에서는 하나의 데이터베이스 트랜잭션에서 더 좋습니다.

외부 파트너와 어떻게해야합니까?
협상 키 및 반복 가능한 응답. 파트너가 지원하지 않는 경우-통화를 dempotent 레이어로 감싸고 "이미 적용된" 저장합니다.

TTL을 선택하는 방법?
최대 지연을 예약하십시오: 로그 유지 + 순/재조정 최악의 경우 + 버퍼. 스톡 추가 (× 2).

합계

Idempotency는 키, 트랜잭션 및 버전의 분야입니다. 안정적인 작업 식별자 + 효과의 원자 고정 및 판독 진행 상황 + dem 등원 싱크/프로젝션은 전송 수준의 마법없이 "정확히 하나의 효과" 를 제공합니다. 키를 결정적이고 TTL을 현실적으로 만들고 악의적 인 테스트를 수행하십 그런 다음 배상과 복제본은 사건이 아닌 일상이됩니다.

Contact

문의하기

질문이나 지원이 필요하시면 언제든지 연락하십시오.우리는 항상 도울 준비가 되어 있습니다!

통합 시작

Email — 필수. Telegram 또는 WhatsApp — 선택 사항.

이름 선택 사항
Email 선택 사항
제목 선택 사항
메시지 선택 사항
Telegram 선택 사항
@
Telegram을 입력하시면 Email과 함께 Telegram에서도 답변드립니다.
WhatsApp 선택 사항
형식: +국가 코드 + 번호 (예: +82XXXXXXXXX).

버튼을 클릭하면 데이터 처리에 동의하는 것으로 간주됩니다.