[Backend · Bazy danych · Architektura oprogramowania]
Architektura backendu i trwałość danych
Architektura serwerowa spinająca platformę: konta, sygnały, ustawienia, stany, zadania w tle, dostęp, raporty i monitoring — rozwijana bez przepisywania.
01Przegląd projektu
Od tej warstwy zależą wszystkie pozostałe przypadki na stronie. Przechowuje użytkowników, sygnały, ustawienia i stany, uruchamia procesy w tle, komunikuje się z zewnętrznymi API i dostarcza informacje do Telegrama i interfejsów webowych.
Nacisk położony jest na kontrolowaną ewolucję: dodawanie funkcji i naprawianie błędów w systemie, który ma już wiele ruchomych części, z weryfikacją każdej zmiany przed produkcją.
02Wyzwanie inżynierskie
Gdy wiele podsystemów korzysta z jednej bazy i działa równolegle, trudne stają się spójność, obsługa awarii i zarządzanie zmianą — a nie pojedyncze funkcje.
- A
Utrzymać spójność stanu między akcjami użytkowników a procesami w tle.
- B
Obsługiwać błędne lub niepełne dane z zewnętrznych usług.
- C
Planować operacje w tle bez nakładania się i utraty pracy.
- D
Zapewnić śledzenie każdego istotnego zdarzenia w logach.
03Architektura rozwiązania
Najedź lub dotknij etapu.
Zewnętrzne API
Giełdy, Telegram, dostawcy AI i inne usługi.
Monitoring i dzienniki zdarzeń obserwują każdy etap.
04Główne komponenty
- 01
Model danych
Tabele i relacje SQL dla kont, sygnałów, ustawień, stanów i historii zdarzeń.
- 02
Warstwa usług
Asynchroniczne usługi w Pythonie hermetyzujące logikę biznesową i integracje zewnętrzne.
- 03
Workery
Procesy w tle dla zadań cyklicznych i długotrwałych.
- 04
Kontrole integralności
Walidacja danych wejściowych i niezmienników przed zapisem.
- 05
Logowanie zdarzeń
Ustrukturyzowane logi łączące akcje użytkowników z pracą w tle.
- 06
Dostarczanie
Endpointy i wiadomości przekazujące wyniki do Telegrama i interfejsów webowych.
05Stack technologiczny
Rdzeń
- Python
- async / await
- aiohttp
Dane
- SQL
- SQLite
- Data modeling
Eksploatacja
- Linux VPS
- Background processes
- Structured logging
06Interaktywna demonstracja
Droga zapytania przez backend
IlustracjaDemo ilustracyjne. Wyślij zapytanie przez warstwy i wstrzyknij awarię, aby zobaczyć, jak błędy są obsługiwane i logowane.
$ tail -f app.log
Monitoring
- przetworzone
- 0
- zdeduplikowane
- 0
- ponowienia
- 0
- odrzucone (błędne)
- 0
- awaria → alert
- 0
07Decyzje inżynierskie
- 01
Rozwijać, nie przepisywać
Zmiany są wprowadzane stopniowo za jasnymi granicami, weryfikowane, a dopiero potem rozszerzane.
- 02
Walidacja przed zapisem
Złe dane są zatrzymywane w warstwie logiki, więc baza pozostaje wiarygodnym źródłem prawdy.
- 03
Idempotentna praca w tle
Workery można bezpiecznie uruchomić ponownie po przerwaniu bez dublowania efektów.
- 04
Logi jako funkcja produktu
Ustrukturyzowane, powiązane logi czynią zachowanie na produkcji wytłumaczalnym.
08Niezawodność i testy
- Weryfikacja zmian względem istniejącego zachowania przed wdrożeniem.
- Deduplikacja zdarzeń i idempotentne przetwarzanie.
- Obsługa błędów wokół każdej zależności zewnętrznej.
- Kontrola rzeczywistego zachowania na produkcji po wdrożeniu.
09Przykład kodu
import sqlite3
from datetime import datetime, timezone
def process_event(db: sqlite3.Connection, event_id: str, source: str, kind: str) -> bool:
"""Returns True if processed now, False if it was already handled."""
try:
with db: # one transaction: mark + apply, or neither
db.execute(
"INSERT INTO processed_events (event_id, source, event_type, processed_at) "
"VALUES (?, ?, ?, ?)",
(event_id, source, kind, datetime.now(timezone.utc).isoformat()),
)
apply_side_effects(db, event_id, kind)
return True
except sqlite3.IntegrityError:
return False # duplicate delivery — safe to ignore
def apply_side_effects(db: sqlite3.Connection, event_id: str, kind: str) -> None:
...Ilustracja Przykład ilustracyjny — idempotentne przetwarzanie zdarzeń w SQLite.
Kod źródłowy produktu jest prywatny. Przykłady pokazują podejście inżynierskie, a nie wewnętrzną logikę. Więcej w Engineering Lab.
10Możliwe kierunki rozwoju
- Migracja do PostgreSQL przy potrzebie większej współbieżności zapisu.
- Endpoint metryk dla długości kolejki i czasu zadań.
- Testy kontraktowe endpointów używanych przez interfejsy.