AT10 — Synchronous/Asynchronous: Message delivery is synchronous from the sender’s perspective (the sender expects a delivery receipt). Message fan-out (to other devices of the same user, to group chat members) is async. Mixing synchronous delivery guarantees with async fan-out reduces the sender’s wait time while still guaranteeing fan-out eventually.
AT9 — Correctness/Performance: Exactly-once message delivery is correct but expensive — it requires distributed transactions to atomically store the message and mark it delivered. At-least-once delivery is simpler: retry on failure, deduplicate on the client using message IDs. Most chat systems use at-least-once with client-side deduplication.
AT5 — Centralisation/Distribution: The connection registry in Redis is a centralised lookup. If Redis is unavailable, no messages can be routed between servers. Redis Cluster distributes the registry, but each lookup still goes through a Redis call. A gossip protocol for connection routing (each server knows which users other servers hold) eliminates this dependency but is harder to implement correctly.