Architecture · SignalR presence
Presence bằng Redis TTL và heartbeat
Presence bằng Redis TTL và heartbeat
Mỗi kết nối là một khoá Redis tự hết hạn sau 90 giây, được instance đang giữ kết nối gia hạn mỗi 30 giây; instance bị kill không gia hạn nên khoá tự biến mất, IsOnlineAsync chỉ coi người dùng online khi còn ít nhất một khoá sống và chỉ phát UserPresenceChanged khi trạng thái đổi.
INSTANCE ỨNG DỤNG
REDIS
SADD
EXPIRE MỖI 30S
KHÔNG GIA HẠN
SMEMBERS
EXISTS
ĐỔI TRẠNG THÁI
Instance A
OnConnected · OnDisconnected
PresenceHeartbeatWorker
PeriodicTimer · 30 giây
Instance B bị kill
OnDisconnected không chạy
Tập kết nối của user
presence:user:{userId}
Set · TTL 90 giây
Khoá mỗi kết nối
presence:{userId}:{connId}
String · TTL 90 giây
IsOnlineAsync
còn ≥ 1 khoá sống = online
khoá hết hạn: SREM (lazy)
UserPresenceChanged
tới nhóm tenant
Không ai gia hạn thì khoá
tự biến mất sau tối đa 90 giây,
không cần bước dọn dẹp nào
Ba tab vẫn chỉ một sự kiện online
CHÚ GIẢI
Thành phần
Điểm mấu chốt
Instance đã chết
Gia hạn TTL
Không còn gia hạn
© tiennhm