On Microservices (Chapter 5 - Journal Reader Services)

September 10, 2025

3 of 4 - Journal Reader Services


For reference, the 4 service types were:

— Journal Reader Service (with a “Push” vs “Pull” semantics prologue first) —

So far we have:

But, how does the data get from the noun services to the underlying data lakes/ponds that the query service pulls from?

This scenario (and a few others) brings us to the realm of the Journal Reader service.

But prior to discussing the specifics of that service, let’s zoom out and first talk about tight / loose couplings between different apps or parts of an app.

A common mistake made in app design is to use ‘push’ when the model should be ‘pull’. This happens in lots of different types of apps, but to illustrate, I’ll (again) pick on commerce systems.

The problematic pattern typically manifests as such:

This is a “push” model.

There are problems with this.

Specifically:

The real issue is that push is a tight-coupled construct.

Said differently, there is a big difference between “this must happen” and “this must happen right now”.

For example, in a commerce system, while we do block completing an order until payment is confirmed, there is no need to block order completion (including responding to the customer) on the creation of a subscription that will be used to bill customers later. Is it necessary for the subscription to be created? Absolutely. Must it happen while the customer is awaiting purchase confirmation? Definitely not.

“Push” is usually only used for actions that must be done in a tight-coupled fashion.

“Pull” is usually a better model to use for loose-coupled activity.

Keep in mind “Pull” doesn’t mean actions need to occur slowly. It just means that actions that should not be held up unnecessariliy, aren’t. It is also a commitment to NOT put dependencies where they don’t belong, even if they seem fast and harmless now. They will bite you. The only question is when.

Have you ever heard this or an equivalent? “What do you mean we can’t sell anything right now because the ads system is down? Who decided this depedency was acceptable? Have you lost your minds?” I have.

Upon reading the commerce system push example above, some will think, “Of course, and that’s why we use [insert favorite queuing or pub/sub system here].

Not so fast.

Those systems usually come with some of the disadvantages already mentioned earlier in this series:

This gets messy fast. And, it is completely avoidable.

Part of the epiphany had by the Microsoft commerce architecture team (see earlier posts) was that they could avoid both the push pain AND the disadvantages (complexity, cost, less reliability, etc.) that come with adding queuing/pubsub systems to the app mix.

So how did they do it?

Via the combination of those journaled updates added to the noun services (which we want for other reasons including customer history, auditing, and more), along with the addition of the Journal Reader service that leverages them.

The Journal Reader takes loose-coupled, pull semantics to a new level (and will likely empower you to start uninstalling some things - more on that later).

So, with that context fresh in our minds, let’s proceed to actually examine the Journal Reader service in our next chapter.

(Albert never actually said this, but he was right. :) )

Onward! Progress! (Click here)