为了账号安全,请及时绑定邮箱和手机立即绑定

GoLang pubsub 服务器停止监听新频道订阅

GoLang pubsub 服务器停止监听新频道订阅

Go
qq_花开花谢_0 2022-11-08 16:12:32
我的 go websocket 应用程序中有一个 redis pubsub 连接,因此每当客户端连接并订阅频道时,它都会监听并发送消息。但是,假设 Client 1 订阅了 channel X,pubsub 开始监听并接收来自它的消息。现在,客户端 1 也订阅了频道Y,因此服务器也应该收听来自该频道的消息,但是它停止收听X并且只收听Y.    for {        switch v := gPubSubConn.Receive().(type) {        case redis.Message:            log.Printf("Received message from %s", v.Channel)            subscriptions := ps.GetSubscriptions(v.Channel, nil)            for _, sub := range subscriptions {                if v.Channel == types.TaskResults {                    go sendTaskResultMessage(v.Data, sub)                } else if v.Channel == types.TaskCount {                    go sendTaskCountMessage(v.Data, sub)                }            }        case redis.Subscription:            log.Printf("Subscription message: %s: %s %d\n", v.Channel, v.Kind, v.Count)        case error:            log.Println("Error pub/sub, delivery stopped")            return        }这是一个示例日志输出go-1  | New Client is connected, total:  1go-1  | 2022/02/16 17:36:03 signature is invalidgo-1  | 2022/02/16 17:36:03 Subscription message: task_count: subscribe 1go-1  | 2022/02/16 17:36:06 Received message from task_countgo-1  | 2022/02/16 17:36:06 Received message from task_countgo-1  | New Client is connected, total:  2go-1  | 2022/02/16 17:36:14 signature is invalidgo-1  | 2022/02/16 17:36:14 Subscription message: task_results: subscribe 1go-1  | 2022/02/16 17:36:16 Received message from task_countgo-1  | 2022/02/16 17:36:16 Received message from task_resultsgo-1  | 2022/02/16 17:36:16 Received message from task_resultsgo-1  | 2022/02/16 17:36:21 Received message from task_resultsgo-1  | 2022/02/16 17:36:21 Received message from task_resultsgo-1  | 2022/02/16 17:36:26 Received message from task_resultsgo-1  | 2022/02/16 17:36:26 Received message from task_resultsgo-1  | 2022/02/16 17:36:31 Received message from task_resultsgo-1  | 2022/02/16 17:36:31 Received message from task_results有什么想法吗?
查看完整描述

1 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

直接的问题是由以下行引起的websocketHandler

gPubSubConn = &redis.PubSubConn{Conn: gRedisConn.Get()}

此行将当前的 pubsub 连接替换为新连接。新连接没有任何订阅。之前的连接泄露了。

在应用程序启动时创建一次 pubsub 连接。

该应用程序至少有一个数据竞争。使用竞赛检测器运行应用程序并修复报告的问题。


查看完整回答
反对 回复 2022-11-08
  • 1 回答
  • 0 关注
  • 57 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信