actu-image
Software engineering PL - 11 maj 2026

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

Witaj w trzeciej, ostatniej części naszej serii o budowie architektury kdb+ tick. W poprzednich częściach omówiliśmy kluczowe pojęcia i uruchomiliśmy kompletny ekosystem obejmujący tickerplant, RDB, HDB i gateway.

Teraz wychodzimy poza ekosystem q, aby zintegrować naszą architekturę z Javą. Za pomocą sterownika javakdb zbudujemy usługi, które potrafią odpytywać nasz system tick, subskrybować jego dane i publikować do niego nowe.


Klient Java dla kdb+

Sterownik javakdb to lekki mechanizm serializacji danych (marshaller), który pozwala aplikacjom Java komunikować się z kdb+ przez TCP/IP. Opiera się na jednej klasie c i czterech podstawowych metodach:

  • c(): nawiązuje połączenie.
  • c.k(): wysyła komunikat synchronicznie (czeka na odpowiedź).
  • c.ks(): wysyła komunikat asynchronicznie (bez czekania na odpowiedź, „fire and forget”).
  • c.close(): zamyka połączenie.

Warunek wstępny: zanim uruchomisz usługi w Javie, upewnij się, że Twoja architektura tick działa (tickerplant na porcie 5010, RDB na porcie 5011).


Odpytywanie kdb+ z poziomu Javy

Najczęstszy przypadek użycia to pobieranie danych z RDB. W Javie tabelę kdb+ reprezentuje obiekt c.Flip – jak w przykładzie poniżej.

// Connect to RDB
c conn = new c("localhost", 5011, "");

// Execute query
c.Flip result = (c.Flip) conn.k("select from trade where sym=`MSFT");

// Access data
int rowCount = c.n(result.y[0]);
for (int i = 0; i < rowCount; i++) {
    System.out.println(c.at(result.y[1], i)); // Print symbol column
}

Subskrypcja danych na żywo

Aby otrzymywać aktualizacje w czasie rzeczywistym, Twoja usługa Java musi subskrybować tickerplant. Metoda conn.k() (bez argumentów) blokuje wykonanie, dopóki TP nie wypchnie nowego komunikatu.

// Subscribe to all symbols on the trade table
conn.k(".u.sub", "trade", "");

while (true) {
    Object response = conn.k(); // Blocking call
    Object[] msg = (Object[]) response;
    c.Flip data = (c.Flip) msg[2];
    // Process live data...
}

Publikowanie do tickerplantu

Możesz też pełnić rolę feed handlera, wysyłając dane do tickerplantu za pomocą wywołań asynchronicznych (ks).

// Send random trade data every second
Object[] row = new Object[]{ new c.Timespan(), "AAPL", 150.25, "B" };
conn.ks(".u.upd", "trade", row);

Java jako serwer dla kdb+

Zamiast odpytywać kdb+ z poziomu Javy, możesz uruchomić w Javie ServerSocket. Dzięki temu kdb+ może wypychać (push) dane bezpośrednio do Twojej aplikacji, a Twoja usługa staje się pasywnym odbiorcą.

ServerSocket ss = new ServerSocket(5050);
c conn = new c(ss); // Accept connection from q
while (true) {
    Object msg = conn.k();
    // Handle pushed data from q script
}

Most między ekosystemami

Opanowując most między Javą a kdb+, możesz włączać wysokowydajne dane tickowe do szerszych, firmowych architektur mikrousług i własnych potoków analitycznych.

Potrzebujesz pomocy w optymalizacji infrastruktury kdb+ lub budowie solidnych wrapperów w Javie? Nasi konsultanci są do Twojej dyspozycji.

Porozmawiaj z ekspertem MARGO
Czym jest c.Flip w sterowniku javakdb?

c.Flip reprezentuje tabelę kdb+. Składa się z tablicy nazw kolumn (x) oraz tablicy tablic zawierających dane kolumn (y).

Czy do publikowania używać wywołań synchronicznych (k), czy asynchronicznych (ks)?

Przy publikowaniu z wysoką częstotliwością (feed handler) zalecane są wywołania asynchroniczne (ks), które nie blokują nadawcy w oczekiwaniu na potwierdzenie.

Czy Java obsługuje typy specyficzne dla kdb+, takie jak Timespan?

Tak, sterownik zawiera dedykowane klasy, np. c.Timespan czy c.Month, które zapewniają dokładne odwzorowanie typów między oboma językami.