Short answer: use one event log behind two transports, keep WebSocket as the normal path, and fall back to Server-Sent Events or a bounded poll when fan-out delivery cannot be trusted. The dashboard should replay from a cursor after every switch; a transport change must never become an acknowledgement that an incident update was seen.
I care about this because an incident response dashboard is a bad place for an elegant demo. A clinician may be watching a medication-service alert while dozens of responders open the same room. The important question is not whether a socket connected. It is whether each authorized viewer can account for every event, in order, after load or a broken network.
What changes when fan-out is the constraint?
Fan-out turns a small realtime feature into a delivery system. One alert can have hundreds of subscribers, and each subscriber has a different connection age, cursor, and permission set.…