Kubernetes部署Laravel WebSocket多Pod场景消息投递丢失问题咨询
排查方案
- 补充缺失的Redis连接关联配置
你当前仅配置了WEBSOCKETS_REPLICATION_MODE=redis,缺少websockets服务对接Redis的必填配置,需要在.env中补充以下参数:
# 确保和你集群内Redis实例的连接参数完全一致 REDIS_HOST=你的Redis服务地址 REDIS_PASSWORD=你的Redis密码(无则留空) REDIS_PORT=6379 REDIS_DB=0 # 可选:强制指定websockets复制用的Redis连接,避免和其他业务缓存冲突 WEBSOCKETS_REDIS_CONNECTION=redis # 强制统一Redis频道前缀,确保所有Pod配置完全相同,避免跨Pod订阅不到同一频道 WEBSOCKETS_REDIS_PREFIX=laravel_websockets
- 校验
config/websockets.php的复制配置
打开配置文件确认replication节点的配置和以下逻辑一致,避免硬编码覆盖了.env的参数:
'replication' => [ 'enabled' => env('WEBSOCKETS_REPLICATION_MODE') === 'redis', 'mode' => env('WEBSOCKETS_REPLICATION_MODE', 'local'), 'redis' => [ 'connection' => env('WEBSOCKETS_REDIS_CONNECTION', 'redis'), 'channel_prefix' => env('WEBSOCKETS_REDIS_PREFIX', 'laravel_websockets'), ], ],
- 确认Pod内websockets服务的运行日志
进入每个Pod查看websockets服务的启动日志,排查是否有Redis订阅失败的报错:- 常见报错包括Redis集群模式不兼容、Redis账号无订阅权限、K8s网络策略限制Pod访问Redis的6379端口
- 确认所有Pod启动后都成功打印了Redis复制功能启用、成功订阅广播频道的相关提示
- 校验广播逻辑的调用方式
不要直接用Pusher实例向指定Pod地址发消息,必须走Laravel自带的广播门面Broadcast::event()触发事件,确保事件会被写入Redis的全局广播频道,被所有Pod订阅到 - 升级到laravel-websockets 2.0最新beta版本
早期2.0 beta版本存在Redis复制频道匹配错误的已知bug,建议升级到beyondcode/laravel-websockets:2.0.0-beta.4及以上版本后重试
内容的提问来源于stack exchange,提问作者shakpit
相关产品推荐
相关产品推荐

