Recently I’ve been using Announcements, a framework for a particular style of event pub/sub within a Smalltalk image. Squeak Smalltalk has a handful of different implementations of the same pub/sub pattern in the default image, and Announcements is a nicely designed generalisation of these.
But why would one want to have a particular implementation of such a common design pattern as pub/sub baked in to the image?
One way of thinking about it, that I’m becoming more and more convinced by, is this:
- If Objects are abstract representations of computers, then
- Announcers are abstract representations of networks.
The communication channel between two objects is normally a regular message send. Regular message sends provide Plain Old RPC (with Exceptions). Sometimes, however, you want one or more of the following things to happen:
- a message to be delivered to more than one recipient
- a message to be delivered to an arbitrary or unknown number of recipients
- a message to be delivered asynchronously, or without reply
- a message to be delivered across a real network to some remote object
Combinations of the above are useful and interesting too.
It’s in situations like these that having a first-class representation of the medium of communication between objects becomes important. And that’s just what Announcers are in the Announcement framework.
One of the too-many things I’m thinking about at the moment is how to generalise Announcers to take into consideration more than just the first two of the four points listed above. Designing and implementing the basic facility seems straightforward, but one runs fairly quickly into issues of concurrency and fault-tolerance.