feat(server): WebSocket 广播支持 Redis Pub/Sub 跨节点扇出(REDIS_ADDR 可选开关)

- 新增 ws.EventBus 接口与 RedisBus 实现;Hub 五类广播改为发布信封、各节点订阅后本地投递
- 单实例不设 REDIS_ADDR 保持进程内直投;Redis 不可用时自动兜底本地投递
- config 新增 REDIS_ADDR/REDIS_PASSWORD/REDIS_DB;dev compose 增加 --profile redis (6380)
- prod compose 与 .env.prod.example 增加多副本配置说明;README 更新已知边界
- 已用双实例 + 真实 Redis 实测跨节点推送;新增总线单测(含发布失败兜底),-race 通过
This commit is contained in:
yml2213
2026-09-05 14:39:56 +08:00
parent 8b9f3d710f
commit 10d2e2ed3d
11 changed files with 430 additions and 6 deletions
+16
View File
@@ -66,6 +66,17 @@ services:
MINIO_ROOT_PASSWORD: ${STORAGE_SECRET_KEY}
STORAGE_BUCKET: ${STORAGE_BUCKET:-kefu}
# 可选:跨节点 WebSocket 广播总线(API 扩多副本时启用)
# .env.prod 设置 REDIS_ADDR=redis:6379 并为 api 副本配置相同值
redis:
image: redis:7-alpine
container_name: kefu-cloud-redis
restart: unless-stopped
volumes:
- kefu_cloud_redisdata:/data
networks:
- kefu_cloud_net
api:
build:
context: .
@@ -100,6 +111,10 @@ services:
STORAGE_MAX_UPLOAD_MB: ${STORAGE_MAX_UPLOAD_MB:-10}
STORAGE_MAX_IMAGE_EDGE: ${STORAGE_MAX_IMAGE_EDGE:-1920}
STORAGE_WEBP_QUALITY: ${STORAGE_WEBP_QUALITY:-80}
# 跨节点 WebSocket 广播(多副本时设为 redis:6379;单实例留空即进程内广播)
REDIS_ADDR: ${REDIS_ADDR:-}
REDIS_PASSWORD: ${REDIS_PASSWORD:-}
REDIS_DB: ${REDIS_DB:-0}
networks:
- kefu_cloud_net
# 不对外暴露 8080,统一走 nginx
@@ -158,3 +173,4 @@ networks:
volumes:
kefu_cloud_pgdata:
kefu_cloud_miniodata:
kefu_cloud_redisdata: