14 years, 8 months ago

Watching Events

It seems that when thinking about events, we have a tendency to put some of the responsibilities in the wrong place. Of course every time we don’t have a proper separation of responsibilities, we get extra complexity. So in this post I will look at some of the issues around the responsibilities and see where they should be allocated.Short political rant that can safely be ignored now. Why is health care insurance (in the USA) handled essentially through employers and employment contracts? They simply don’t belong to each other. The time base is wrong, the administration is wrong, the result is wrong.End of rant!I think a little naming context would be helpful here. This will be greatly simplified – just so that the essence is laid bare.E is an event publisherE has an output queue onto which itpublishes. This is called EQE publishes events of type V1, V2, V3 and V4. Individual events are named v1-1, (the first event of type V1), v1-2 (the second event of type V1), etc.C1 is a consumer of events – it can consume events of type V1, V2C2 is a Consumer of events – it can consume events of type V2, V3, V4C3 is a consumer of events – it can consume all kinds of events.Each consumer has an input queue – C1 has an input queue C1Q, C2 has C2Q, C3 has C3QThe event network behaves as follows:E publishes v1-1. The event network must transfer v1-1 to C1Q and C3Q. C1Q and C3Q. C1 and C3 are now able to process the events by reading their respective queues.Thinking about the outcome possibilities (assuming E was successfuly able to publish) v1-1.Both C1 and C3 receive the event v1-1C1 receives the event v1-1, but C3 does not.C1 does not receive the event v1-1, but C3 doesneither C1 nor C3 receive the event.Question for the reader. Where should the responsibility lie in taking action for recognizing that one of these conditions obtains. The possibilities are:(a) E(b) C1(c) C3(d) none of the aboveMy answer is (d) – none of the above. It isn’t any of these players’ responsibility to do this. E’s job was to publish the events. C1 and C3’s jobs are to handle the events on behalf of their scope. But C1 and C3 are autonomous, so they can’t be dealing with each others’ failures.So if it is (d), then there must be some other partcipant – yet to be identified that takes the responsibility. That something else is a proxy for the overall business policy. It needs to exist independently of everything else – and therefore needs to have the proper information fed to it.Now imagine that C1 in some sense “fails” – it completes, but delivers an exception condition. If that condition is serious enough then something has to know. So it would be sensible C1 were to notify something of its own outcome.Likewise C2 and C3.So we have a kind of triplet of notifications (which expand into greater complexity for real sized problems).E says, “I sent e1-1″C1 says, “I got e1-1″C1 says “I handled e1-1 with a normal result”C3 says, “I got e1-1″C3 says, “I couldn’t do e1-1 – I failed because of a business problem.”So we could then implement a policy rule about what to do under these circumstances. That rule could of course inject new events into the “system.” That however is a subject for another time.Bottom line is that we have a three part system now for handling events. There is the standard pub/sub behavior (and don’t get too hung up on the specific technologies). There is the abilty to send out content references using a mechanism that is not part of the event channel (quite RESTful really), and then there is the ability to act on non-receipt or improper handling of the event by one of the event subscribers.A nice compact model that seperates concerns, so that the individual components can be focussed on their own responsibilities and not prying into each others’ business.