actu-image
Software engineering PL - 08 maj 2026

kdb+ Tick Architecture: budowa systemu danych rynkowych w czasie rzeczywistym w Javie i q [część 2]

Witaj w drugiej części serii o budowie architektury kdb+ tick. W pierwszej części omówiliśmy kluczowe pojęcia i przeszliśmy przez kolejne komponenty – od tickerplantu, RDB, HDB i RTS po gateway i dalej.

Czas przełożyć teorię na praktykę: w tej części skonfigurujemy i uruchomimy od podstaw pełną architekturę kdb+ tick krok po kroku.


Konfiguracja środowiska kdb+/q

Zanim uruchomimy naszą architekturę tick, musimy przygotować kdb+ i q – zainstalować je i skonfigurować na swojej maszynie. Przejdź na stronę kx.com/kdb-personal-edition-download i pobierz darmową edycję osobistą.

Możesz też skorzystać z darmowego środowiska sandbox (JupyterLab) udostępnianego w KX Academy – bez żadnych wymagań wstępnych, wszystko działa w przeglądarce.

Po pobraniu i rozpakowaniu (np. do C:\q) skonfiguruj zmienne środowiskowe:

Ustaw QHOME:

setx QHOME "C:\q"

Dodaj do PATH:

setx PATH "%PATH%;C:\q\w64"
q terminal prompt

Klonowanie repozytorium git KxSystems

Sklonuj poniższe repozytorium, aby pobrać przykładowe skrypty architektury:

git clone https://github.com/KxSystems/kdb-architecture-course.git

Uruchomienie tickerplantu (TP)

Tickerplant to serce architektury. Uruchom go poleceniem:

q tick.q sym . -p 5010

Plik sym.q definiuje naszą tabelę trade:

trade:([]time:`timespan$();sym:`g#`symbol$();price:`float$();side:`symbol$())

Uruchomienie Real-Time Database (RDB)

RDB subskrybuje tickerplant i przechowuje dane z bieżącego dnia w pamięci. Uruchom go poleceniem:

q tick/rdb.q -p 5011

Uruchomienie feed handlera

Feed handler generuje dane i wysyła je do tickerplantu. Uruchom go poleceniem:

q tick/feed.q

Otwiera połączenie i co sekundę generuje losowe transakcje:

h_tp:hopen 5010;
system"t 1000";

Uruchomienie Historical Database (HDB)

HDB udostępnia dane z dysku. Uruchom go poleceniem:

q tick/hdb.q sym -p 5012

Poniższe polecenie symuluje zdarzenie końca dnia (End-of-Day, EOD) – uruchom je w tickerplancie:

q).u.endofday[]

Uruchomienie Real-Time Subscriber (RTS)

RTS wykonuje własną logikę na przychodzących danych. Uruchom go poleceniem:

q tick/rts.q -p 5013

Przechowuje ostatnią cenę dla każdego symbolu:

latestSymPrice: `sym xkey 0#trade;
`latestSymPrice upsert select by sym from d

Uruchomienie gatewaya

Gateway to pojedynczy punkt wejścia dla zapytań. Uruchom go poleceniem:

q tick/gw.q -p 5014

Kieruje zapytania jednocześnie do HDB i RDB:

h_hdb:hopen 5012; h_rdb:hopen 5011;
hdb,rdb

Od teorii do praktyki z kdb+

Zbudowanie w pełni działającej architektury tick to ważny krok w opanowaniu kdb+. Łącząc tickerplant, RDB, HDB i gateway, masz teraz system zdolny obsłużyć cały cykl życia danych wysokiej częstotliwości.


Chcesz skalować swoją architekturę lub zintegrować ją z firmowym środowiskiem Java? Eksperci MARGO pomogą Ci zapanować nad złożonością inżynierii danych w czasie rzeczywistym.

Skontaktuj się z naszymi ekspertami
Czym jest QHOME i dlaczego jest niezbędne do konfiguracji?

QHOME to zmienna środowiskowa, która wskazuje systemowi kdb+, gdzie znajdują się jego podstawowe pliki i biblioteki. Bez niej interpreter q nie może załadować kluczowych funkcji ani skryptów potrzebnych do działania architektury tick.

Jak sprawdzić, czy subskrybent jest poprawnie połączony z tickerplantem?

Uruchom polecenie .u.w w procesie tickerplantu. Zwróci ono słownik z listą wszystkich aktywnych subskrybentów i tabel, które obserwują, np. RDB lub RTS.

Co dzieje się z danymi w RDB podczas zdarzenia końca dnia (End-of-Day, EOD)?

Podczas EOD tickerplant powiadamia RDB, aby zapisał wszystkie dane z pamięci na dysku jako nową partycję dzienną. Po zakończeniu zapisu RDB czyści swoje lokalne tabele i zaczyna kolejny dzień od zera.

Dlaczego kdb+ stosuje enumerację symboli w HDB?

Enumeracja symboli mapuje symbole (podobne do łańcuchów znaków) na liczby całkowite w pliku sym. Ta optymalizacja znacząco zmniejsza zużycie pamięci i przyspiesza zapytania na dużych zbiorach historycznych, bo eliminuje wielokrotne przechowywanie tych samych łańcuchów.

Czy gateway obsłuży jednocześnie zapytania o dane z dziś i z wczoraj?

Tak. Gateway kieruje jedno zapytanie zarówno do RDB (dane w czasie rzeczywistym), jak i do HDB (dane historyczne), a wyniki scala w jedną spójną odpowiedź dla użytkownika końcowego.