gpt4 book ai didi

go - 使用 golang 扩展 webscocket 连接

转载 作者:IT王子 更新时间:2023-10-29 01:41:48 26 4
gpt4 key购买 nike

   func handleConn(w http.ResponseWriter, r *http.Request) {
ws, err := upgrader.Upgrade(w, r, nil)
if err != nil {
if _, ok := err.(websocket.HandshakeError); !ok {
log.Println(err)
}
return
}

go writer(ws)
reader(r, ws)
}

func main() {
http.HandleFunc("/", handleConn)
}

我正在尝试使用 golang 构建一个高扩展性的 websocket 服务器。由于 native go websocket 包中缺少支持,我正在使用 https://github.com/gorilla/websocket .

对于每个连接,都会生成一个 goroutine 来处理对其的写入。用于扩展大量连接。假设我有 1M 的并发连接,那么服务器上应该有 1M 的 goroutines 正在运行。

硬件规范:

16GB 内存

4核CPU

2.5 GHz 英特尔酷睿 i5

是否可以在不影响性能的情况下处理大量连接?

最佳答案

让我们做一些数学:

理论上:每个 go-routine 消耗 8KB 内存。因此,对于一百万个插槽,需要 8GB 的​​内存。

现在,让我们将范式转向实用性。由于您使用的是网络套接字,因此您正在寻找双向 channel 通信。因此,您必须保留一个缓冲区来从每个套接字读取数据。因此,另外 8 GB 的 RAM 仅用于监听来自套接字的数据。这些数字仅表示旋转和生成一百万个连接所需的资源,不包括其他重要因素(为其他任务保留的资源、内核保留空间、操作系统保留空间等)

结论:这种方法很简单,但无法扩展到一定限度。

您肯定需要更多的 RAM,才能按建议的数字进行缩放。

你可以通过实现像 kQueue/ePoll 这样的东西来最小化内存消耗。通过这种方法,而不是不断地等待数据被消耗,浪费缓冲内存,你会实现一个回调,如果套接字准备好读取/写入数据,它会得到通知,然后你可以创建一个缓冲区并进行读取/对文件描述符的写操作。这将帮助您重用缓冲区,从而减少资源消耗。

希望对您有所帮助!

关于go - 使用 golang 扩展 webscocket 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41258268/

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