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
- 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.
- 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.
- 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.
- 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ć.
- 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
Wdrożenia headless commerce na Medusie
Sklep pudełkowy narzuca własny model danych, własne reguły koszyka i własny harmonogram wydań. Medusa v2 jest frameworkiem, który stoi u Ciebie, więc to, co w Twojej sprzedaży odstaje od szablonu, da się zbudować zamiast obchodzić dookoła.
Integracje z marketplace'ami — Allegro
Sprzedaż na Allegro obok własnego sklepu zwykle kończy się jednym katalogiem prowadzonym w dwóch miejscach i arkuszem, który to wszystko spina. Oferty, stany i zamówienia mogą być w tym samym panelu co reszta asortymentu.
Automatyzacja cen i kontrola marży
Ceny w walutach obcych, które przeliczają się same każdego dnia po kursie średnim NBP, i koszt zakupu widoczny przy produkcie, dzięki czemu marża jest liczbą w panelu, a nie czymś, co raz na miesiąc składa się w arkuszu.
Przeczytaj opinie firm, które nam zaufały
Dostarczone znacznie wcześniej niż termin.
Indywidualne podejście ZanReal jest imponujące.
Wiedza i intuicja biznesowa czynią ich wartościowym partnerem.
Szybkie rozwiązania, które obniżyły koszty o 99%.
+20% dostarczalności dla naszych kampanii e-mail.

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 nasPowiedz, 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.
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