actu-image
Software engineering - 11 Mai 2026

Architecture kdb+ Tick : mise en place d'un système de données de marché en temps réel à l'aide de Java et de q [PART 3]

Bienvenue dans la troisième et dernière partie de notre série sur la construction d’une architecture kdb+ tick. Dans les volets précédents, nous avons exploré les concepts fondamentaux et lancé avec succès un écosystème complet comprenant le Tickerplant, la RDB, la HDB et la Gateway.

À présent, nous sortons de l’écosystème q pour intégrer notre architecture avec Java. En utilisant le driver javakdb, nous allons construire des services capables d’interroger, de s’abonner et de publier des données vers notre système tick.


Le client Java pour kdb+

Le driver javakdb est un « marshaller » de données léger qui permet aux applications Java de communiquer avec kdb+ via TCP/IP. Il s’articule autour d’une classe unique c et de quatre méthodes essentielles :

  • c() : Établir une connexion.
  • c.k() : Envoyer un message synchrone (attendre une réponse).
  • c.ks() : Envoyer un message asynchrone (envoyer et oublier).
  • c.close() : Fermer la connexion.

Prérequis : Assurez-vous que votre architecture tick est opérationnelle (Tickerplant sur le port 5010, RDB sur le port 5011) avant de lancer vos services Java.


Interroger kdb+ depuis Java

Le cas d’utilisation le plus courant consiste à récupérer des données depuis la RDB. En Java, une table kdb+ est représentée par un objet c.Flip.

// Connexion à la RDB
c conn = new c("localhost", 5011, "");

// Exécution de la requête
c.Flip result = (c.Flip) conn.k("select from trade where sym=`MSFT");

// Accès aux données
int rowCount = c.n(result.y[0]);
for (int i = 0; i < rowCount; i++) {
    System.out.println(c.at(result.y[1], i)); // Affiche la colonne des symboles
}

S'abonner aux données en direct

Pour recevoir des mises à jour en temps réel, votre service Java doit s'abonner au Tickerplant. La méthode conn.k() (sans argument) est bloquante jusqu'à ce qu'un nouveau message soit poussé par le TP.

// Abonnement à tous les symboles de la table trade
conn.k(".u.sub", "trade", "");

while (true) {
    Object response = conn.k(); // Appel bloquant
    Object[] msg = (Object[]) response;
    c.Flip data = (c.Flip) msg[2];
    // Traitement des données en direct...
}

Publier vers le Tickerplant

Vous pouvez également agir en tant que "Feed Handler" en poussant des données vers le Tickerplant via des appels asynchrones (ks).

// Envoi de données de transaction aléatoires chaque seconde
Object[] row = new Object[]{ new c.Timespan(), "AAPL", 150.25, "B" };
conn.ks(".u.upd", "trade", row);

Agir comme serveur pour kdb+

Au lieu que Java interroge kdb+, vous pouvez configurer un ServerSocket Java. Cela permet à kdb+ de pousser directement les données vers votre application, transformant votre service en consommateur passif.

ServerSocket ss = new ServerSocket(5050);
c conn = new c(ss); // Accepter la connexion depuis q
while (true) {
    Object msg = conn.k();
    // Gérer les données poussées par le script q
}

Relier les écosystèmes

En maîtrisant le pont Java-kdb+, vous pouvez désormais intégrer des données tick haute performance dans des microservices d'entreprise plus larges et des pipelines analytiques personnalisés.

Besoin d'aide pour optimiser votre infrastructure kdb+ ou construire des wrappers Java robustes ? Nos consultants sont prêts à vous accompagner.

Échanger avec un expert MARGO
Qu'est-ce que c.Flip dans le driver javakdb ?

Un c.Flip représente une table kdb+. Il se compose d'un tableau de noms de colonnes (x) et d'un tableau de tableaux contenant les données des colonnes (y).

Dois-je utiliser des appels synchrones (k) ou asynchrones (ks) pour la publication ?

Pour la publication à haute fréquence (Feed Handler), les appels asynchrones (ks) sont préférables pour éviter de bloquer l'émetteur en attendant un accusé de réception.

Java peut-il gérer les types spécifiques à kdb+ comme Timespan ?

Oui, le driver inclut des classes spécifiques comme c.Timespan ou c.Month pour garantir un mapping parfait des types entre les deux langages.