-
Notifications
You must be signed in to change notification settings - Fork 18
publish
Most other actor systems expect you to tell
all messages directly to other actors. If you want a pub-sub model then you're expected to create a publisher actor that can take subscription messages, that it uses to manage a registry of publishers to deliver messages to. It's all a bit bulky and unnecessary.
So with LanguageExt.Process
each process manages its own internal subscriber list. If a process needs to announce something it calls:
// Publish a message for anyone listening
publish(msg);
Another process can subscribe to that by calling:
subscribe(processId);
(The subscriber can do this in its setup phase, and the process system will auto-unsub when the process dies, and auto-resub when it restarts)
This means the messages that are published by one process can be consumed by any number of others (via their inbox in the normal way). I found I was jumping through hoops to do this with other actor systems. But sometimes, as I say, you want to jump outside of that system.
For example, if your code is outside of the process system, it can get an IObservable
stream instead:
var sub = observe<Thing>(processId).Subscribe( msg => ...);
A good example of this is the 'Dead Letters' process, it gets all the messages that failed for one reason or another (serialisation problems, the process doesn't exist, the process crashed, etc.). All it does is call publish(msg)
. This is how it's defined:
var deadLetters = spawn<DeadLetter>("dead-letters",publish);
That's it! For a key piece of infrastructure. So it's then possible to easily listen and log issues, or hook it up to a process that persists the dead letter messages.