Introduction à Chronicle Queue

1. Vue d'ensemble

Chronicle Queue persiste chaque message à l'aide d'un fichier mappé en mémoire. Cela nous permet de partager des messages entre les processus.

Il stocke les données directement dans la mémoire hors tas, ce qui le rend exempt de surcharge GC. Il est conçu pour fournir un cadre de messages à faible latence pour les applications hautes performances.

Dans cet article rapide, nous examinerons l'ensemble des opérations de base.

2. Dépendances de Maven

Nous devons ajouter la dépendance suivante:

 net.openhft chronicle 3.6.4 

Nous pouvons toujours vérifier les dernières versions hébergées par le Maven Central avec le lien fourni auparavant.

3. Blocs de construction

Il existe trois concepts caractéristiques de Chronicle Queue:

  • Extrait - est un conteneur de données
  • Appender - appender est utilisé pour écrire des données
  • Trailer - est utilisé pour la lecture séquentielle des données

Nous réserverons la partie de la mémoire pour les opérations de lecture-écriture à l'aide de l' interface Chronicle .

Voici l'exemple de code pour créer une instance:

File queueDir = Files.createTempDirectory("chronicle-queue").toFile(); Chronicle chronicle = ChronicleQueueBuilder.indexed(queueDir).build();

Nous aurons besoin d'un répertoire de base où la file d'attente conservera les enregistrements dans les fichiers mappés en mémoire.

La classe ChronicleQueueBuilder fournit différents types de files d'attente. Dans ce cas, nous avons utilisé IndexedChronicleQueue WHIC h utilise l'indice séquentiel pour maintenir des décalages de mémoire des enregistrements dans une file d' attente.

4. Écriture dans la file d'attente

Pour écrire les éléments dans une file d'attente, nous devons créer un objet de la classe ExcerptAppender à l' aide de l' instance Chronicle . Voici un exemple de code pour écrire les messages dans la file d'attente:

Voici un exemple de code pour écrire les messages dans la file d'attente:

ExcerptAppender appender = chronicle.createAppender(); appender.startExcerpt(); String stringVal = "Hello World"; int intVal = 101; long longVal = System.currentTimeMillis(); double doubleVal = 90.00192091d; appender.writeUTF(stringValue); appender.writeInt(intValue); appender.writeLong(longValue); appender.writeDouble(doubleValue); appender.finish();

Après avoir créé l'appender, nous allons démarrer l'appender en utilisant une méthode startExcerpt . Il commence un extrait avec la capacité de message par défaut de 128 Ko . Nous pouvons utiliser une version surchargée de startExcerpt pour fournir une capacité personnalisée.

Une fois démarré, nous pouvons écrire n'importe quelle valeur littérale ou objet dans la file d'attente en utilisant un large éventail de méthodes d'écriture fournies par la bibliothèque.

Enfin, lorsque nous aurons terminé l'écriture, nous terminerons l'extrait, enregistrerons les données dans une file d'attente et plus tard sur le disque.

5. Lecture à partir de la file d'attente

La lecture des valeurs de la file d'attente peut être facilement effectuée à l'aide de l' instance ExcerptTrailer .

C'est comme un itérateur que nous utilisons pour parcourir une collection en Java.

Lisons les valeurs de la file d'attente:

ExcerptTailer tailer = chronicle.createTailer(); while (tailer.nextIndex()) { tailer.readUTF(); tailer.readInt(); tailer.readLong(); tailer.readDouble(); } tailer.finish();

Après avoir créé la bande-annonce, nous utilisons la méthode nextIndex pour vérifier s'il y a un nouvel extrait à lire.

Une fois que ExcerptTailer a un nouvel extrait à lire, nous pouvons en lire les messages en utilisant une gamme de méthodes de lecture pour les valeurs de type littéral et objet.

Enfin, nous terminons la lecture avec l' API de finition .

6. Conclusion

Dans ce didacticiel, nous avons donné une brève introduction à la file d'attente des chroniques et à ses éléments de base. Nous avons vu comment créer une file d'attente, écrire et lire des données. Son utilisation offre de nombreux avantages, notamment une faible latence, une communication inter-processus (IPC) durable et aucune surcharge de nettoyage de la mémoire.

La solution assure la persistance des données via des fichiers mappés en mémoire - sans perte de données. Il permet également des lectures-écritures simultanées à partir de plusieurs processus; cependant, les écritures sont gérées de manière synchrone.

Comme toujours, tous les extraits de code peuvent être trouvés sur GitHub.