TGStat
TGStat
Type to search
Advanced channel search
  • flag English
    Site language
    flag Russian flag English flag Uzbek
  • Sign In
  • Catalog
    Channels and groups catalog Regional compilations Thematic compilations Платные каналы Search for channels
    Add a channel/group
  • Ratings
    Rating of channels Rating of groups Posts rating
    Ratings of brands and people
  • Analytics
  • Search by posts
  • Telegram monitoring
  • Promotion
    Advertising through Yandex Business Advertising in channels through TGStat Agency Advertising on TGStat.ru website
Maxim Korobov — DevBlog

21 Mar, 10:00

Open in Telegram Share Report

Transactional Inbox

Пост в продолжение к паттерну Outbox. Outbox гарантирует at-least-once. Но кто гарантирует, что сообщение обработают ровно один раз?

Кажется, достаточно просто обрабатывать сообщения на консьюмере, но тут кроется самая важная проблема - дубли. Двойные списания, двойные записи в БД. Consumer не гарантирует exactly-once. Возможна ошибка коммита, OOM или ретрай.

Какое решение? Использовать Inbox

Суть следующая:

1. Создаем таблицу inbox, где будем хранить idempotency_key
2. При обработке события делаем в одной транзакции вставку в две таблицы: inbox и payments.


INSERT INTO inbox (idempotency_key) VALUES ($1) ON CONFLICT DO NOTHING
-- если inserted = 0, значит дубль — выходим
INSERT INTO payments (order_id, amount, status) VALUES ($1, $2, 'pending')


Важно, что захват ключа и бизнес-операция происходят либо вместе, либо никак.

Итого, exactly-once в распределённых системах - это иллюзия, за которой скрывается at-least-once доставка и идемпотентная обработка на каждом узле.

88 0 0 7
Catalog
Channels and groups catalog Channels compilations Search for channels Add a channel/group
Ratings
Rating of Telegram channels Rating of Telegram groups Posts rating Ratings of brands and people
API
API statistics Search API of posts API Callback
Our channels
@TGStat @TGStat_Chat @telepulse @TGStatAPI
Read
Академия TGStat Telegram Research 2019 Telegram Research 2021 Telegram Research 2023
Contacts
Справочный центр Support Email Jobs
Miscellaneous
Terms and conditions Privacy policy Public offer
Our bots
@TGStat_Bot @SearcheeBot @TGAlertsBot @tg_analytics_bot @TGStatChatBot