Event-driven architecture (EDA) is a software architecture pattern promoting the production, detection, consumption of, and reaction to events. An event can be defined as "a significant change in state". (Wikipedia)
Event Driven system makes a loosely coupled enterprise system among components – because it is notification based. An event-driven system typically consists of event emitters (or agents) and event consumers (or sinks). Sinks have the responsibility of applying a reaction as soon as an event is presented.
If we see publisher-Subscriber model, it has attractive properties. Subscribers are decoupled and each respectively unaware of the fact, which application will receive the message and who actually send the message. Similarly sender or publisher just triggers the messagees, and thats it.
Decoupling in this way yields a powerful layer of extensibility whereby "n" number of applications can be integrated to consume messages with no modification required to those that produce them.
What is the message? To me I say it is a channel, a topic, an object information or whatever that is known to publishers and subscribers. Each message may also have more than one publisher, and publishers can be plugged or unplugged dynamically.
Messaging layer has responsibility to define messages/topics and know which subscribers are interested in which topics. I read about a nice idea of keeping topics as simple as just a string. It could be hierarchical and can support wild card message publishing (could be a requirement). Moreover messages can have expiry time to be handle within the bracket.
My first step is to create a simple decoupled publish-subscriber framework where subscribers are decouples and are loaded through xml once dynamically. This is a blocking and sequential enumeration of subscribers interested in a topic (implemented IConsumer<T>), and calling them in a single for loop to entertain each receiver. With such simple Notification system may be we can extend the idea in future to have asynchronous messaging, or even the receivers can be services (service bus?) I yet to explore it.
This article was good as starting point: I changed it according to my need.
I have following set of classes:
Here is a registration.xml to dynamically load the subscribers.
<?xml version="1.0" encoding="utf-8" ?>
<Subscriber ClassName="EventHandler.Subscriber.Subscriber.OrderSubmittedConsumer.EmailNotificationConsumer" DllPath="..\..\..\EventHandler.Subscriber\bin\Debug\EventHandler.Subscriber.dll" />
<Subscriber ClassName="EventHandler.Subscriber.Subscriber.OrderSubmittedConsumer.NotifyBOPConsumer" DllPath="..\..\..\EventHandler.Subscriber\bin\Debug\EventHandler.Subscriber.dll" />
<Subscriber ClassName="EventHandler.Subscriber.Subscriber.OrderSubmittedConsumer.NotifyToInventoryConsumer" DllPath="..\..\..\EventHandler.Subscriber\bin\Debug\EventHandler.Subscriber.dll" />
<Subscriber ClassName="EventHandler.Subscriber.Subscriber.OrderSubmittedConsumer.SaveEventInDBConsumer" DllPath="..\..\..\EventHandler.Subscriber\bin\Debug\EventHandler.Subscriber.dll" />
<Subscriber ClassName="EventHandler.Subscriber.Subscriber.BookPublishedConsumer.PublishAnnouncementConsumer" DllPath="..\..\..\EventHandler.Subscriber\bin\Debug\EventHandler.Subscriber.dll" />
<Subscriber ClassName="ExternalPlugin.RoyalBookFreeSampleConsumer" DllPath="..\..\..\ExternalPlugin\bin\Debug\ExternalPlugin.dll"/>
- IMessage: a message or a topic or a channel, what ever you say - information travel from publisher to subscribers.
- IEventPublisher: have single method to publish an event.
- ISubscriptionService: get the list of all interested subscriber based on their concrete IConcumer<> implementation
public class PublishAnnouncementConsumer : IConsumer<BookPublishedMessage>
It tells framework that I am consumer of BookPublishedMessage, that is when ever it is published call my handle method and pass the message/topic information.
If want to play with this Notification System source code - I have one on sky drive. DOWNLOAD from skydrive. (FileName: EventDrivenModel.zip)
Your comments are much appreciated.