E-commerce

Subskrypcje i rozliczenia za faktyczne użycie

Zanim wystawisz rachunek za zużycie, potrzebujesz dziennika zdarzeń, który obronisz w rozmowie z klientem. Najtrudniejsze jest to, że to samo zdarzenie prędzej czy później przyjdzie dwa razy.

To nie jest problem cennika

Cennik za zużycie powstaje w jedno popołudnie. Progi, pule wliczone w abonament, stawka za nadmiar, tabelka na stronie. Ta część nikomu nie sprawia kłopotu.

Kłopot zaczyna się w dniu, w którym księgowość pyta, dlaczego suma z raportu nie zgadza się z sumą z rachunków, albo klient dzwoni z pytaniem o jedną pozycję. Musisz wtedy pokazać zapis tego, co się wydarzyło, zdarzenie po zdarzeniu, komuś, kto ma wszelki interes w tym, żeby znaleźć w nim dziurę.

To problem porządku w danych, a nie cennika. Trudność jest przy tym na tyle zwyczajna, że łatwo ją zlekceważyć: to samo zdarzenie przyjdzie dwa razy. Sieć ponawia. Funkcja bywa ubita w połowie żądania i uruchomiona od nowa. Kolejka dostarcza ponownie, bo zgubiło się potwierdzenie, a nie sama wiadomość. Każdy z tych przypadków zamieniony w drugą opłatę to w najlepszym razie zgłoszenie do wsparcia.

Jedno zdarzenie, jeden wiersz, jedna opłata

Klucz deduplikacji powstaje jako funkcja czysta SHA-256 z faktów samego zdarzenia. Te same fakty, ten sam klucz, zawsze i wszędzie, bez uzgadniania czegokolwiek między procesami.

Istotne jest to, co dzieje się z tym kluczem dalej. Staje się kluczem głównym wiersza, zamiast leżeć w osobno indeksowanej kolumnie sprawdzanej przed zapisem. Ta różnica jest całym mechanizmem: duplikat odrzuca sama baza, w ramach tego samego zapisu. Nie ma okna między sprawdzeniem a zapisem, przez które przecisnęłoby się równoległe ponowienie, i nie ma osobnej usługi deduplikującej, którą trzeba utrzymywać przy życiu.

Cena tego rozwiązania jest realna i stoi w dokumentacji zamiast siedzieć w przypisie. Dwa naprawdę różne zdarzenia, identyczne co do milisekundy, zlewają się w jeden wiersz. To świadome niedoliczenie. Skoro system rozliczeniowy musi się czasem mylić, niech myli się w stronę, której klient nie zobaczy na wyciągu.

Co dzieje się między zdarzeniem a zapisem

Zapis zdarzenia waliduje je, wylicza klucz, odkłada do bufora i wraca. Nikt nie czeka na zapis do bazy, co ma znaczenie, gdy miejsce zapisu leży na ścieżce żądania, której ktoś mierzy czas.

Partia opuszcza bufor, gdy się zapełni, domyślnie przy 500 zdarzeniach, albo gdy najstarsze zdarzenie w niej doczeka interwału zrzutu, domyślnie pięciu sekund. Przy dziesięciu tysiącach zdarzeń w buforze włącza się wstrzymanie. Partia, której nie udało się zapisać, wraca na początek kolejki, a nie na koniec, więc chwilowa awaria nie przestawia po cichu kolejności dziennika. Niezależnie od tego zadanie cykliczne zrzuca bufor co minutę, co ratuje sytuację przy małym ruchu, gdzie partia potrafiłaby stać w połowie pełna.

Bufor żyje w pamięci. Twarde ubicie procesu gubi to, co nie zdążyło się zapisać, chyba że włączysz tryb natychmiastowego zrzutu. Ten wybór zostawiamy Tobie, osobno dla każdego licznika. Licznik o dużym wolumenie zwykle woli bufor, a licznik czegoś rzadkiego i drogiego zwykle nie.

Okresy, taryfa i naprawianie pomyłek

Okres rozliczeniowy to przedział półotwarty z deterministycznym identyfikatorem. W praktyce oznacza to, że dwa systemy pytające o ten sam okres na pewno mówią o tym samym zbiorze zdarzeń, a nie o dwóch zachodzących na siebie przybliżeniach.

Taryfikacja korzysta z taryfy, w której siedzi kwota jednostkowa, dzielnik jednostek dla liczników mierzonych naturalnie w tysiącach czegoś oraz pula wliczona w abonament. Zamknięcie okresu zamraża wynik i dopiero to zamienia rosnącą sumę w liczbę, którą wypada komuś wysłać.

Korekty są dopisywane, nigdy nakładane na istniejący wpis. Pomyłkę naprawia się wpisem storno z ujemną ilością, więc w dzienniku zostaje zarówno pierwotne wskazanie, jak i późniejsza decyzja o nim.

Jedną granicę warto postawić od razu, zamiast zostawiać Cię z odkrywaniem jej w trzecim tygodniu. medusa-usage nie wystawia faktur i nie ma w niej harmonogramu zamykania okresów. Produkuje zamrożone wyniki okresów, przeliczone według taryfy. Zamiana ich w dokumenty i płatności to osobny zakres, który chętnie zbudujemy, ale nie udajemy, że jest już w pudełku.

Kiedy dziennik przerasta bazę sklepu

Większość liczników spokojnie mieszka w PostgreSQL obok reszty sklepu, gdzie deduplikacja dzieje się mimochodem, przy okazji istnienia klucza głównego. Nie wszystkie. Licznik idący w miliardy zdarzeń w końcu zacznie wypychać z bazy to, do czego ta baza jest potrzebna.

Dla takich przypadków medusa-usage-tinybird wysyła te same zdarzenia do Tinybird na ClickHouse. Schemat wtyczka wnosi ze sobą, jedno źródło danych i trzy endpointy, więc nie dostajesz w prezencie projektu modelowania danych. Instalacja jest opcjonalna, a wdrożenie, które jej nie zakłada, nie zmienia się ani trochę.

ClickHouse nie zna ograniczenia klucza głównego, więc deduplikacja musi się gdzieś przenieść i przenosi się na odczyt. Każdy endpoint scala duplikaty przed sumowaniem i zostawia najwcześniej zapisaną kopię. Dokładnie tę samą kopię trzyma zapis w PostgreSQL, więc oba dają ten sam wynik z założenia, a nie przez przypadek. Deklarowany token ma prawo dopisywania do źródła danych i odczytu z endpointów, i nic ponadto.

Jak wpinamy stronę raportującą

Każdy system rozliczania zużycia ma drugą połowę, czyli aplikację, która to zużycie w ogóle zgłasza. To właśnie tam gubi się najwięcej zdarzeń.

Budujemy ją z trwałym outboxem. Każda partia trafia do outboxu przed pierwszą próbą wysyłki, więc funkcja ubita w połowie żądania kosztuje opóźnioną dostawę, a nie dziurę w dzienniku. Godzinowe zadanie dobiera to, czego próba w locie nie dokończyła, dzięki czemu odzyskiwanie danych jest rutyną, a nie śledztwem.

Druga zasada mówi, że jedynym miejscem wyliczania klucza deduplikacji jest Medusa. Aplikacja raportująca nigdy nie dopisuje do dziennika bezpośrednio, więc klucz powstaje w jednym miejscu. Dwa wyliczenia to dwie szanse na rozjazd, a rozjazd w kluczu deduplikacji nie należy do błędów, które znajduje się szybko.

Nie jest to rysunek z oferty. Tak zbudowane jest rozliczanie subskrypcji i zużycia naszej własnej platformy, na sklepie Medusa, który hostujemy sami.

Co dostajesz

Dziennik zdarzeń tylko do dopisywania dla Medusa v2

Zdarzenia zapisuje się i nigdy nie edytuje. Dziennik obsługuje wymienne miejsca docelowe, zapis w partiach, deterministyczną deduplikację, okresy rozliczeniowe i taryfikację, wszystko wewnątrz Medusy, którą i tak utrzymujesz.

Deduplikacja, której ponowienie nie obejdzie

Klucz deduplikacji to funkcja czysta SHA-256 z faktów samego zdarzenia, a ten klucz jest kluczem głównym wiersza, a nie osobno indeksowaną kolumną. Zapis jest przez to atomowy, więc powtórna dostawa nie kosztuje nic.

Trzy obsługiwane sposoby zapisu zdarzenia

Z kontenera, z workflow, subskrybenta albo trasy, oraz przez endpoint API panelu, który odpowiada kodem 202 i zwraca wyliczone klucze. Zapisywać mogą wyłącznie uwierzytelnieni użytkownicy panelu, bo nieuwierzytelnionej ścieżki zapisu celowo nie ma.

Okresy rozliczeniowe i taryfa

Okresy to przedziały półotwarte z deterministycznymi identyfikatorami. Taryfa ma kwotę jednostkową, dzielnik jednostek i pulę wliczoną w abonament, a zamknięcie okresu zamraża wynik, więc spóźnione zdarzenie nie zmieni już uzgodnionego rachunku.

Korekty dopisywane jako storno

Pomyłkę naprawia się wpisem z ujemną ilością. Nie ma aktualizacji ani usuwania, więc widać zarówno to, co pierwotnie policzono, jak i to, co potem postanowiono z tym zrobić.

Tinybird do liczników idących w miliardy

Gdy dziennik przerasta bazę sklepu, te same zdarzenia trafiają do Tinybird na ClickHouse. Wtyczka wnosi gotowy schemat, jedno źródło danych i trzy endpointy, a jej instalacja jest w pełni opcjonalna.

Jak pracujemy

  1. 01

    Ustalamy, czym w ogóle jest zdarzenie

    Najpierw rozstrzygamy, co się liczy, jakie fakty identyfikują pojedyncze wystąpienie i co w związku z tym oznaczają dwa identyczne zdarzenia. To pytanie handlowe, nie techniczne, a cały system stoi właśnie na tej odpowiedzi.

  2. 02

    Wybieramy, gdzie leży dziennik

    Większość liczników zostaje w PostgreSQL obok reszty sklepu, gdzie deduplikację załatwia klucz główny. Liczniki idące w miliardy zdarzeń przenosimy do Tinybird. Oba miejsca docelowe są obsługiwane i skonfigurowane tak, żeby dawały ten sam wynik.

  3. 03

    Stronę raportującą wpinamy przez outbox

    Tak to budujemy. Aplikacja zapisuje każdą partię do trwałego outboxu przed pierwszą próbą wysyłki, więc funkcja ubita w połowie żądania kosztuje opóźnioną dostawę, a nie utracony przychód. Godzinowe zadanie dobiera to, czego próba w locie nie dokończyła.

  4. 04

    Układamy taryfę i zamykamy pierwszy okres

    Kwota jednostkowa, dzielnik jednostek, pula wliczona w abonament, a potem prawdziwe zamknięcie na prawdziwych danych. Zamknięcie zamraża wynik i dopiero to zamienia bieżącą sumę w liczbę, którą można komuś wysłać.

  5. 05

    Uzgadniamy liczby, zanim ktokolwiek zapłaci

    Licznik chodzi obok tego, z czego rozliczasz się dzisiaj, i porównujemy oba wyniki, zanim nowe liczby zaczną cokolwiek znaczyć. Uzgadnianie jest tu prostsze niż w większości systemów, bo do dziennika można tylko dopisywać i każdą kwotę da się rozłożyć na zdarzenia, z których powstała.

Narzędzia i technologie

Tam, gdzie istnieje dobre narzędzie open source, wybieramy je zamiast zamkniętego. Bez uzależnienia od jednego dostawcy i z kosztami, które da się przewidzieć.

  • Medusa v2
  • TypeScript
  • Node.js
  • PostgreSQL
  • Redis
  • Tinybird
  • ClickHouse
  • Next.js
  • Vercel
  • @zanreal/medusa-usage
  • @zanreal/medusa-usage-tinybird

Najczęściej zadawane pytania

Pozostałe usługi w tej kategorii

Przeczytaj opinie firm, które nam zaufały

Zawsze są kilka kroków do przodu.

Mikołaj

CEO & Founder, GBS®

Zobacz na Clutch
GBS® logo

Dostarczone znacznie wcześniej niż termin.

Yasniel

CEO, IMEGA Sp z o.o.

Zobacz na Clutch

Indywidualne podejście ZanReal jest imponujące.

Adam

Executive, w-studio.pl

Zobacz na Clutch

Wiedza i intuicja biznesowa czynią ich wartościowym partnerem.

Magda

Designer, DIGITALUNI

Zobacz na Clutch

Szybkie rozwiązania, które obniżyły koszty o 99%.

Andrei Kapytau

Team Lead, busel.uk

Zobacz na Clutch

+20% dostarczalności dla naszych kampanii e-mail.

Joan Calabria

Sales Director, 36NORTH

Zobacz na Clutch
36NORTH logo

Najnowsze

Poradniki techniczne, bezpieczeństwo i nasze doświadczenia z budowania rozwiązań AI.

Chcesz rozliczać zużycie i nie spierać się potem o liczby?

Napisz do nas

Powiedz, co liczysz i jak te zdarzenia trafiają dziś do Ciebie. Ułożymy z tego taryfę i dziennik, który przetrwa ponowioną próbę, wdrożenie w środku dnia i klienta czytającego pozycję po pozycji.

Zanek

Nie nadążasz za zmianami w świecie AI?

Pozwól, że weźmiemy to na siebie. Co tydzień destylujemy najważniejsze wydarzenia ze świata AI w skupiony, 5-minutowy przegląd - żebyś był na bieżąco bez szumu.

Dowiedz się więcej
Tygodnik AIonline
Wyselekcjonowane wiadomości AI do porannej kawy. Co tydzień.
Wyślij mi swój email, żeby się zapisać.