Czyszczenie kluczy idempotencji

1 min czytania

Czyszczenie kluczy idempotencji

Każde żądanie JSON-RPC zawierające pole idempotencyKey jest zapisywane w tabeli pgarachne.requests przez funkcję pgarachne.save_idempotency_key(). Właśnie to sprawia, że wykrywanie duplikatów działa — ale oznacza to również, że tabela rośnie bez ograniczeń, jeśli operator nie uruchamia okresowo czyszczenia.

PgArachne samo nie posiada wewnętrznego harmonogramu zadań w tle. Najczystsze opcje:

pg_cron (zalecane, jeśli możesz instalować rozszerzenia)

-- Uruchamiaj co godzinę, usuń klucze starsze niż 24 godziny
SELECT cron.schedule(
  'pgarachne-idempotency-cleanup',
  '0 * * * *',
  $$SELECT pgarachne.cleanup_idempotency_keys('24 hours'::interval);$$
);

Zewnętrzny cron/timer systemd

Zaplanuj zadanie shell, które wywołuje funkcję przez psql:

0 * * * * psql "host=... user=... dbname=..." \
  -c "SELECT pgarachne.cleanup_idempotency_keys('24 hours'::interval);" \
  >> /var/log/pgarachne-cleanup.log 2>&1

Ręcznie/ad-hoc

Możesz wywołać tę funkcję w dowolnym momencie z psql, skryptu migracji lub jakiegokolwiek innego klienta. Zwraca liczbę usuniętych wierszy.

SELECT pgarachne.cleanup_idempotency_keys();          -- domyślnie: 24 godziny
SELECT pgarachne.cleanup_idempotency_keys('7 days'::interval);

Wybór okna retencji

Wybierz okno wygodnie dłuższe niż najdłuższy oczekiwany interwał ponownych prób twoich klientów. Jeśli błędnie działający klient powtórzy to samo klucz idempotencji 48 godzin po pierwotnym żądaniu, 24-godzinne okno retencji bezgłośnie przepuści duplikat.

Dla większości wdrożeń 24 godziny to bezpieczna wartość domyślna.