我正在使用golang
来自 的 Redis 库github.com/go-redis/redis
。我的客户端监听一个名为“control”的 PubSub 通道。每当消息到达时,我都会处理它并继续接收下一条消息。我没完没了地听着,信息经常出现,有时好几天都没有。
我希望 Redis 通道能够无限地保持打开状态并在发送消息时接收消息。
通常它会运行几天,但偶尔client.Receive()
会返回EOF
错误。发生此错误后,客户端不再在该通道上接收消息。在内部,redis 客户端向 stdout 打印以下消息:
redis: 2019/08/29 14:18:57 pubsub.go:151: redis: 丢弃坏的 PubSub 连接: EOF
免责声明:我不确定这个错误是导致我停止接收消息的原因,它只是看起来相关。
我想了解为什么会发生这种情况,如果这是正常的,并且client.Subscribe()
每当我遇到这种行为时重新连接到频道是否是一个很好的补救措施,或者我应该解决根本问题,无论它是什么。
这是处理我的客户端的完整代码(连接到 redis、订阅频道、无休止地接收消息):
func InitAndListenAsync(log *log.Logger, sseHandler func(string, string) error) error {
rootLogger = log.With(zap.String("component", "redis-client"))
host := env.RedisHost
port := env.RedisPort
pass := env.RedisPass
addr := fmt.Sprintf("%s:%s", host, port)
tlsCfg := &tls.Config{}
client = redis.NewClient(&redis.Options{
Addr: addr,
Password: pass,
TLSConfig: tlsCfg,
})
if _, err := client.Ping().Result(); err != nil {
return err
}
go func() {
controlSub := client.Subscribe("control")
defer controlSub.Close()
for {
in, err := controlSub.Receive() // *** SOMETIMES RETURNS EOF ERROR ***
if err != nil {
rootLogger.Error("failed to get feedback", zap.Error(err))
break
}
switch in.(type) {
case *redis.Message:
cm := comm.ControlMessageEvent{}
payload := []byte(in.(*redis.Message).Payload)
if err := json.Unmarshal(payload, &cm); err != nil {
rootLogger.Error("failed to parse control message", zap.Error(err))
} else if err := handleIncomingEvent(&cm); err != nil {
rootLogger.Error("failed to handle control message", zap.Error(err))
}
慕容708150
繁星点点滴滴
冉冉说
相关分类