Files
backend/internal/pkg/ws/publisher.go
lan c630cbf4d0
All checks were successful
Build Backend / build (push) Successful in 2m0s
Build Backend / build-docker (push) Successful in 1m26s
feat(ws): implement WebSocket cluster mode with Redis Pub/Sub
Introduce a new WebSocket messaging architecture that supports both standalone and cluster modes. This allows for horizontal scaling of WebSocket servers by using Redis Pub/Sub to synchronize messages across multiple instances.

Key changes:
- Added `ws.MessagePublisher` interface to abstract message distribution.
- Implemented `ws.Bus` to handle cluster-mode messaging via Redis.
- Added `ws.OnlineTracker` to manage user online status across the cluster.
- Refactored multiple services (Chat, Group, Push, Call, etc.) to use the new `MessagePublisher` instead of a concrete `ws.Hub`.
- Added WebSocket configuration options (mode, instance ID, channel, TTL, heartbeat) to `config.yaml` and `config.go`.
- Updated dependency injection with Wire to support the new publisher and Redis client.
- Improved logging by replacing standard `log` with `zap` in several service components.
2026-05-06 12:39:11 +08:00

23 lines
884 B
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package ws
// MessagePublisher 定义消息发布接口
// ws.Hub 隐式满足此接口ws.Bus 组合 Hub 并扩展跨实例能力
type MessagePublisher interface {
// 消息发布
PublishToUser(userID string, eventType string, payload any) Event
PublishToUsers(userIDs []string, eventType string, payload any)
PublishToUsersConcurrent(userIDs []string, eventType string, payload any)
PublishToUserOnline(userID string, eventType string, payload any) bool
PublishToUserOnlineReliable(userID string, eventType string, payload any) bool
Broadcast(eventType string, payload any)
// 在线状态
HasClients(userID string) bool
FilterOnline(userIDs []string) (online, offline []string)
// 本地操作(不经过 Redis
SendError(client *Client, code string, message string)
NextID() uint64
OnDisconnect(handler DisconnectHandler)
OnConnect(handler ConnectHandler)
}