gpt4 book ai didi

go - 如何在golang中释放一个websocket和redis网关服务器资源?

转载 作者:IT王子 更新时间:2023-10-29 02:07:03 25 4
gpt4 key购买 nike

我有一个网关服务器,它可以使用 websocket 将消息推送到客户端,一个新的客户端连接到我的服务器,我将生成一个 cid为了它。然后我还订阅了一个 channel ,使用 cid .如果有任何消息发布到该 channel ,我的服务器会将其推送到客户端。现在,所有单元都工作正常,但是当我尝试通过 thor 进行基准测试时,它会崩溃,我罚款 DeliverMessage有一些问题,它永远不会退出,因为它有一个死循环。但由于redis需要订阅一些东西,我不知道如何避免循环。

func (h *Hub) DeliverMessage(pool *redis.Pool) {
conn := pool.Get()
defer conn.Close()
var gPubSubConn *redis.PubSubConn
gPubSubConn = &redis.PubSubConn{Conn: conn}
defer gPubSubConn.Close()

for {
switch v := gPubSubConn.Receive().(type) {
case redis.Message:
// fmt.Printf("Channel=%q | Data=%s\n", v.Channel, string(v.Data))
h.Push(string(v.Data))
case redis.Subscription:
fmt.Printf("Subscription message: %s : %s %d\n", v.Channel, v.Kind, v.Count)
case error:
fmt.Println("Error pub/sub, delivery has stopped", v)
panic("Error pub/sub")
}
}
}

在主函数中,我将上面的函数调用为:

go h.DeliverMessage(pool)

但是当我用巨大的连接测试它时,它会给我一些错误,比如:

ERR max number of clients reached

因此,我通过更改 MaxIdle 来更改 redis 池大小:

func newPool(addr string) *redis.Pool {
return &redis.Pool{
MaxIdle: 5000,
IdleTimeout: 240 * time.Second,
Dial: func() (redis.Conn, error) { return redis.Dial("tcp", addr) },
}
}

但它仍然不起作用,所以我想知道,在我的 websocket 在以下选择中断开与我的服务器的连接后,是否有任何好的方法可以杀死 goroutine:

case client := <-h.Unregister:
if _, ok := h.Clients[client]; ok {
delete(h.Clients, client)
delete(h.Connections, client.CID)
close(client.Send)
if err := gPubSubConn.Unsubscribe(client.CID); err != nil {
panic(err)
}
// TODO kill subscribe goroutine if don't client-side disconnected ...

}

但是我如何识别这个 goroutine?我该怎么做unix方法。 kill -9 <PID>

最佳答案

看例子here

一旦您没有收到更多信息,您可以通过在 DeliverMessage 的 switch case 中使用 return 语句来退出 goroutine。我猜 case error ,或者如示例中所示,case 0你想从那里返回,你的 goroutine 将取消。或者如果我误解了事情,并且case client := <-h.Unregister:在 DeliverMessage 里面,直接返回即可。

您还关闭了两次连接。 defer gPubSubConn.Close()只需调用 conn.Close() 所以你不需要 defer conn.Close()

另请查看 the Pool并查看所有参数的实际作用。如果要处理很多连接,请将 MaxActive 设置为 0 “当为零时,池中的连接数没有限制。” (你真的想要空闲超时吗?)

关于go - 如何在golang中释放一个websocket和redis网关服务器资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55646243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com