Introduction à la file d’attente des chroniques

Introduction à la file d'attente des chroniques

1. Vue d'ensemble

La file d'attente des chroniques conserve chaque message à l'aide d'un fichier mappé en mémoire. Cela nous permet de partager des messages entre processus.

It stores data directly to off-heap memory, therefore, making it free of GC overhead. Il est conçu pour fournir une structure de messages à faible latence pour les applications hautes performances.

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

2. Dépendances Maven

Nous devons ajouter lesfollowing dependency:


    net.openhft
    chronicle
    3.6.4

Nous pouvons toujours consulter les dernières versions hébergées par Maven Central à l'aide du lien fourni auparavant.

3. Blocs de construction

Trois concepts sont caractéristiques de la file d'attente des chroniques:

  • Excerpt – est un conteneur de données

  • L'appendeurAppender – 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érationsread-write à l'aide de l'interfaceChronicle.

Voici l'exemple de code permettant de 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 dans lequel la file d'attente conservera les enregistrements dans des fichiers mappés en mémoire.

La classeChronicleQueueBuilder fournit différents types de files d'attente. Dans ce cas, nous avons utiliséIndexedChronicleQueue quih utilise l'index séquentiel pour maintenir les décalages de mémoire des enregistrements dans une file d'attente.

4. Ecrire dans la file d'attente

Pour écrire les éléments dans une file d'attente, nous devons créer un objet de la classeExcerptAppender à l'aide de l'instanceChronicle. 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éthodestartExcerpt. Il démarre unExcerpt avec la capacité de message par défaut de128K. Nous pouvons utiliser une version surchargée destartExcerpt pour fournir une capacité personnalisée.

Une fois démarré, nous pouvons écrire n'importe quelle valeur littérale ou d'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, puis sur disque.

5. Lecture depuis la file d'attente

La lecture des valeursfrom la file d'attente peut être facilement effectuée en utilisant l'instanceExcerptTrailer.

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éthodenextIndex pour vérifier s'il y a un nouvel extrait à lire.

Une fois queExcerptTailer a un nouveauExcerpt à lire, nous pouvons y lire les messages en utilisant une plage de méthodesread pour les valeurs de type littéral et objet.

Enfin, nous terminons la lecture avec l'APIfinish.

6. Conclusion

Dans ce tutoriel, nous avons brièvement présenté la file d'attente des chroniques et ses blocs de construction. Nous avons vu comment créer une file d'attente, écrire et lire des données. Son utilisation offre de nombreux avantages, notamment une communication inter-processus durable (IPC) à faible temps de latence, ainsi que l'absence de temps système pour la récupération de place.

La solution assure la persistance des données via des fichiers mappés en mémoire, sans perte de données. Il permet également la lecture-écriture simultanée de plusieurs processus. Cependant, les écritures sont traitées de manière synchrone.

Comme toujours, tous les extraits de code peuvent être trouvésover on GitHub.