Class EventsBySliceFirehoseQuery
- java.lang.Object
-
- akka.persistence.query.typed.scaladsl.EventsBySliceFirehoseQuery
-
- All Implemented Interfaces:
ReadJournal,EventsBySliceQuery,EventsBySliceStartingFromSnapshotsQuery,EventTimestampQuery,LatestEventTimestampQuery,LoadEventQuery
public final class EventsBySliceFirehoseQuery extends java.lang.Object implements ReadJournal, EventsBySliceQuery, EventsBySliceStartingFromSnapshotsQuery, EventTimestampQuery, LoadEventQuery, LatestEventTimestampQuery
This wrapper ofEventsBySliceQuerygives better scalability when many consumers retrieve the same events, for example many Projections of the same entity type. The purpose is to share the stream of events from the database and fan out to connected consumer streams. Thereby fewer queries and loading of events from the database.It is retrieved with:
val queries = PersistenceQuery(system).readJournalFor[EventsBySliceQuery](EventsBySliceFirehoseQuery.Identifier)Corresponding Java API is in
EventsBySliceFirehoseQuery.Configuration settings can be defined in the configuration section with the absolute path corresponding to the identifier, which is
"akka.persistence.query.events-by-slice-firehose"for the defaultIdentifier(). Seereference.conf.
-
-
Constructor Summary
Constructors Constructor Description EventsBySliceFirehoseQuery(ExtendedActorSystem system, com.typesafe.config.Config config, java.lang.String cfgPath)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description <Event> Source<EventEnvelope<Event>,NotUsed>eventsBySlices(java.lang.String entityType, int minSlice, int maxSlice, Offset offset)Query events for given slices.<Snapshot,Event>
Source<EventEnvelope<Event>,NotUsed>eventsBySlicesStartingFromSnapshots(java.lang.String entityType, int minSlice, int maxSlice, Offset offset, scala.Function1<Snapshot,Event> transformSnapshot)Same asEventsBySliceQuerybut with the purpose to use snapshots as starting points and thereby reducing number of events that have to be loaded.static java.lang.StringIdentifier()scala.concurrent.Future<scala.Option<java.time.Instant>>latestEventTimestamp(java.lang.String entityType, int minSlice, int maxSlice)<Event> scala.concurrent.Future<EventEnvelope<Event>>loadEnvelope(java.lang.String persistenceId, long sequenceNr)Load a single event on demand.intsliceForPersistenceId(java.lang.String persistenceId)scala.collection.immutable.Seq<scala.collection.immutable.Range>sliceRanges(int numberOfRanges)scala.concurrent.Future<scala.Option<java.time.Instant>>timestampOf(java.lang.String persistenceId, long sequenceNr)
-
-
-
Constructor Detail
-
EventsBySliceFirehoseQuery
public EventsBySliceFirehoseQuery(ExtendedActorSystem system, com.typesafe.config.Config config, java.lang.String cfgPath)
-
-
Method Detail
-
Identifier
public static java.lang.String Identifier()
-
eventsBySlices
public <Event> Source<EventEnvelope<Event>,NotUsed> eventsBySlices(java.lang.String entityType, int minSlice, int maxSlice, Offset offset)
Description copied from interface:EventsBySliceQueryQuery events for given slices. A slice is deterministically defined based on the persistence id. The purpose is to evenly distribute all persistence ids over the slices.The consumer can keep track of its current position in the event stream by storing the
offsetand restart the query from a givenoffsetafter a crash/restart.The exact meaning of the
offsetdepends on the journal and must be documented by the read journal plugin. It may be a sequential id number that uniquely identifies the position of each event within the event stream. Distributed data stores cannot easily support those semantics and they may use a weaker meaning. For example it may be a timestamp (taken when the event was created or stored). Timestamps are not unique and not strictly ordered, since clocks on different machines may not be synchronized.In strongly consistent stores, where the
offsetis unique and strictly ordered, the stream should start from the next event after theoffset. Otherwise, the read journal should ensure that between an invocation that returned an event with the givenoffset, and this invocation, no events are missed. Depending on the journal implementation, this may mean that this invocation will return events that were already returned by the previous invocation, including the event with the passed inoffset.The returned event stream should be ordered by
offsetif possible, but this can also be difficult to fulfill for a distributed data store. The order must be documented by the read journal plugin.The stream is not completed when it reaches the end of the currently stored events, but it continues to push new events when new events are persisted. Corresponding query that is completed when it reaches the end of the currently stored events is provided by
CurrentEventsBySliceQuery.currentEventsBySlices.- Specified by:
eventsBySlicesin interfaceEventsBySliceQuery
-
eventsBySlicesStartingFromSnapshots
public <Snapshot,Event> Source<EventEnvelope<Event>,NotUsed> eventsBySlicesStartingFromSnapshots(java.lang.String entityType, int minSlice, int maxSlice, Offset offset, scala.Function1<Snapshot,Event> transformSnapshot)
Description copied from interface:EventsBySliceStartingFromSnapshotsQuerySame asEventsBySliceQuerybut with the purpose to use snapshots as starting points and thereby reducing number of events that have to be loaded. This can be useful if the consumer start from zero without any previously processed offset or if it has been disconnected for a long while and its offset is far behind.- Specified by:
eventsBySlicesStartingFromSnapshotsin interfaceEventsBySliceStartingFromSnapshotsQuery
-
sliceForPersistenceId
public int sliceForPersistenceId(java.lang.String persistenceId)
- Specified by:
sliceForPersistenceIdin interfaceEventsBySliceQuery- Specified by:
sliceForPersistenceIdin interfaceEventsBySliceStartingFromSnapshotsQuery
-
sliceRanges
public scala.collection.immutable.Seq<scala.collection.immutable.Range> sliceRanges(int numberOfRanges)
- Specified by:
sliceRangesin interfaceEventsBySliceQuery- Specified by:
sliceRangesin interfaceEventsBySliceStartingFromSnapshotsQuery
-
timestampOf
public scala.concurrent.Future<scala.Option<java.time.Instant>> timestampOf(java.lang.String persistenceId, long sequenceNr)- Specified by:
timestampOfin interfaceEventTimestampQuery
-
loadEnvelope
public <Event> scala.concurrent.Future<EventEnvelope<Event>> loadEnvelope(java.lang.String persistenceId, long sequenceNr)
Description copied from interface:LoadEventQueryLoad a single event on demand. TheFutureis completed with aNoSuchElementExceptionif the event for the givenpersistenceIdandsequenceNrdoesn't exist.- Specified by:
loadEnvelopein interfaceLoadEventQuery
-
latestEventTimestamp
public scala.concurrent.Future<scala.Option<java.time.Instant>> latestEventTimestamp(java.lang.String entityType, int minSlice, int maxSlice)- Specified by:
latestEventTimestampin interfaceLatestEventTimestampQuery
-
-