Documentation
Welcome to docs|Projections|Handling eventual consistency

Handling eventual consistency

This page describes how to handle eventual consistency in Serialized in situations where you need to read data that has not yet been processed by the projection.

Since projections are eventually consistent, you might need to handle situations where you need to read data that has not yet been processed by the projection. This is especially true when you need to read data that has been written to an aggregate as a result of a user action, and the user expects to see the updated data immediately.

Waiting for the projection to be created

When you're expecting a new projection to be created, you can use the awaitCreation parameter in Serialized. This will wait for the projection to be created before returning the response, so the client will effectively hang until the data is available.

In the following example, we're querying a new projection with name orders-by-id with id 45f184b5-f5a5-4c7e-88c0-5ed246675478 and waits up to 3 seconds for it to be created before cancelling the request:

var orderId = "45f184b5-f5a5-4c7e-88c0-5ed246675478";var request = ProjectionQueries.single("orders-by-id")        .withId(orderId)        .withAwaitCreation(Duration.ofSeconds(3))        .build(OrderProjection.class);        // Will wait up to 3 secondsvar order = projectionClient.<OrderProjection>query(request).data(); 
const orderId = '45f184b5-f5a5-4c7e-88c0-5ed246675478'const request = {projectionName: 'orders-by-id', projectionId: orderId}const options = {awaitCreation: 3000}// Will wait up to 3 secondsconst response = await projectionsClient.getSingleProjection(request, options)

Optimistically presenting transient data

Many applications can get away with presenting data in the UI before it has been persisted. This is a common pattern in many distributed systems to handle scalability and performance issues.