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 MARGOCzym 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.