On ZeroMQ it could be something like that...first you need a broker (a proxy) using XSUB and XPUB.
In one pharo image... (I think this part better be done in C because it will freezy the image forever but it works)

��| frontend backend |
frontend := ZmqXSubscriberSocket new.
frontend bind: 'tcp://*:5559'.
backend := ZmqXPublisherSocket new.
backend bind: 'tcp://*:5560'.
ZmqProxy frontend: frontend backend: backend capture: nil

In any publisher or subscriber...

publisher := ZmqPublisherSocket new connect: 'tcp://localhost:5559'.

pr1 := [
|subscriber1|
subscriber1 := ZmqSubscriberSocket new connect: 'tcp://localhost:5560'.
[true] whileTrue:[
�� �� �� �� �� "receive is non blocking so this is an infinite loop"
subscriber1 receiveIfAvailable: [ :messageData| ��
messageData isEmpty ifFalse:[Transcript show: ('Subscriber 1 got stuff ' , messageData);cr]]
]] forkNamed: 'subscriber1'.

"Publish doing that"
��publisher send: ('Hello Subscribers') asByteArray.

El jue, 1 jul 2021 a las 21:03, Esteban Maringolo (<emaringolo@gmail.com>) escribi��:
On Thu, Jul 1, 2021 at 3:00 PM Jesus Mari Aguirre
<jmariaguirre@gmail.com> wrote:
>
> As far as I know, zmq doesn't need a broker but subscribers should know the address of the publisher, if the network increases its complexity with more publishers you need a broker,�� that is a proxy on zmq.
> If I understand well you need any of them should be able to publish a change to all of the other images?

I want to broadcast notifications of updated objects so they can be
recomputed or reloaded from the database to reflect the latest
changes.
The change might happen in any of the worker images, either by user UI
or API call.

Regards!

Esteban A. Maringolo