Inleiding tot Chronicle Queue

1. Overzicht

Chronicle Queue houdt elk bericht vast met behulp van een in het geheugen toegewezen bestand. Hierdoor kunnen we berichten tussen processen delen.

Het slaat gegevens rechtstreeks op in off-heap-geheugen, waardoor het vrij is van GC-overhead. Het is ontworpen om een ​​berichtraamwerk met lage latentie te bieden voor krachtige toepassingen.

In dit korte artikel zullen we de basisset van bewerkingen bekijken.

2. Maven afhankelijkheden

We moeten de volgende afhankelijkheid toevoegen:

 net.openhft kroniek 3.6.4 

We kunnen altijd de nieuwste versies bekijken die worden gehost door de Maven Central met de eerder verstrekte link.

3. Bouwstenen

Er zijn drie concepten die kenmerkend zijn voor Chronicle Queue:

  • Uittreksel - is een datacontainer
  • Appender - appender wordt gebruikt voor het schrijven van gegevens
  • Aanhangwagen - wordt gebruikt voor het opeenvolgend lezen van gegevens

We reserveren het geheugengedeelte voor lezen schrijven operaties met Kroniek koppel.

Hier is de voorbeeldcode voor het maken van een instantie:

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

We hebben een basismap nodig waar de wachtrij records in geheugen-toegewezen bestanden zal behouden.

ChronicleQueueBuilder class biedt verschillende soorten wachtrijen. In dit geval hebben we IndexedChronicleQueue which gebruikt de sequentiële index om geheugenoffsets van records in een wachtrij te behouden.

4. Schrijven naar de wachtrij

Om de items naar een wachtrij te schrijven, moeten we een object maken van UittrekselAppender klasse gebruiken Kroniek voorbeeld. Hier is een voorbeeldcode voor het schrijven van de berichten naar de wachtrij:

Hier is een voorbeeldcode voor het schrijven van de berichten naar de wachtrij:

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

Nadat we de appender hebben gemaakt, starten we de appender met een start uittreksel methode. Het begint een Uittreksel met de standaard berichtcapaciteit van 128K. We kunnen een overbelaste versie van start uittreksel om een ​​aangepaste capaciteit te bieden.

Eenmaal gestart, kunnen we elke letterlijke of objectwaarde naar de wachtrij schrijven met behulp van een breed scala aan schrijfmethoden die door de bibliotheek worden aangeboden.

Ten slotte, als we klaar zijn met schrijven, maken we het fragment af, slaan we de gegevens op in een wachtrij en later op schijf.

5. Lezen uit de wachtrij

De waarden lezen van de wachtrij kan eenvoudig worden gedaan met behulp van de Uittreksel Trailer voorbeeld.

Het is net als een iterator die we gebruiken om een ​​verzameling in Java te doorlopen.

Laten we waarden uit de wachtrij lezen:

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

Nadat we de trailer hebben gemaakt, gebruiken we de volgendeIndex methode om te controleren of er een nieuw fragment te lezen is.

Een keer UittrekselTailer heeft een nieuwe Uittreksel om te lezen, kunnen we er berichten van lezen met behulp van een bereik van lezen methoden voor letterlijke en objecttypewaarden.

Ten slotte eindigen we het lezen met de af hebben API.

6. Conclusie

In deze tutorial hebben we een korte inleiding gegeven tot de Chronicle Queue en zijn bouwstenen. We hebben gezien hoe we een wachtrij kunnen maken, gegevens kunnen schrijven en lezen. Het gebruik ervan biedt vele voordelen, waaronder lage latentie, duurzame interprocescommunicatie (IPC) en geen overhead voor garbagecollection.

De oplossing biedt gegevenspersistentie via geheugen toegewezen bestanden - zonder gegevensverlies. Het maakt ook gelijktijdige lees- en schrijfbewerkingen van meerdere processen mogelijk; Schrijfbewerkingen worden echter synchroon afgehandeld.

Zoals altijd zijn alle codefragmenten te vinden op GitHub.