当多个客户端使用时,Gorilla websocket 非常慢
Gorilla websocket very slow when more than one client using it
我使用 gorilla websocket 制作了一个小型聊天应用程序。当只有一个客户端时,速度很快,正如预期的那样。但是当我连接到另一个客户端时,聊天可能需要 3 秒才能更新,即使托管在我的本地计算机上也是如此。
websocket 代码:
var clients = make(map[*websocket.Conn]bool)
var broadcast = make(chan Message)
var upgrader = websocket.Upgrader{}
func main() {
router.HandleFunc("/ws", handleConnections)
err := http.ListenAndServe(":80", router)
}
func handleConnections(w http.ResponseWriter, r *http.Request) {
ws, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Fatal(err)
}
defer ws.Close()
clients[ws] = true
for {
var msg Message
err := ws.ReadJSON(&msg)
if err != nil {
log.Printf("error: %v", err)
delete(clients, ws)
break
}
broadcast <- msg
}
}
func handleMessages() {
for {
msg := <-broadcast
log.Println(msg)
database, _ := sql.Open("sqlite3", "./database.db")
statement, _ := database.Prepare("CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY, username TEXT, message TEXT, timestamp INTEGER)")
statement.Exec()
statement, _ = database.Prepare("INSERT INTO messages (username, message, timestamp) VALUES (?, ?, ?)")
statement.Exec(&msg.Username, &msg.Message, &msg.Timestamp)
for client := range clients {
err := client.WriteJSON(msg)
if err != nil {
log.Printf("error: %v", err)
client.Close()
delete(clients, client)
}
}
}
}
问题是尝试写入时数据库被锁定。修复很简单
每次查询为 运行 时延迟 rows.Close()。
例如:
func messages(w http.ResponseWriter, r *http.Request) {
rows, _ := database.Query("SELECT username, message, timestamp FROM messages")
defer rows.Close()
var messages []Message
for rows.Next() {
var msg Message
rows.Scan(&msg.Username, &msg.Message, &msg.Timestamp)
messages = append(messages, msg)
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(messages)
}
我使用 gorilla websocket 制作了一个小型聊天应用程序。当只有一个客户端时,速度很快,正如预期的那样。但是当我连接到另一个客户端时,聊天可能需要 3 秒才能更新,即使托管在我的本地计算机上也是如此。
websocket 代码:
var clients = make(map[*websocket.Conn]bool)
var broadcast = make(chan Message)
var upgrader = websocket.Upgrader{}
func main() {
router.HandleFunc("/ws", handleConnections)
err := http.ListenAndServe(":80", router)
}
func handleConnections(w http.ResponseWriter, r *http.Request) {
ws, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Fatal(err)
}
defer ws.Close()
clients[ws] = true
for {
var msg Message
err := ws.ReadJSON(&msg)
if err != nil {
log.Printf("error: %v", err)
delete(clients, ws)
break
}
broadcast <- msg
}
}
func handleMessages() {
for {
msg := <-broadcast
log.Println(msg)
database, _ := sql.Open("sqlite3", "./database.db")
statement, _ := database.Prepare("CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY, username TEXT, message TEXT, timestamp INTEGER)")
statement.Exec()
statement, _ = database.Prepare("INSERT INTO messages (username, message, timestamp) VALUES (?, ?, ?)")
statement.Exec(&msg.Username, &msg.Message, &msg.Timestamp)
for client := range clients {
err := client.WriteJSON(msg)
if err != nil {
log.Printf("error: %v", err)
client.Close()
delete(clients, client)
}
}
}
}
问题是尝试写入时数据库被锁定。修复很简单 每次查询为 运行 时延迟 rows.Close()。 例如:
func messages(w http.ResponseWriter, r *http.Request) {
rows, _ := database.Query("SELECT username, message, timestamp FROM messages")
defer rows.Close()
var messages []Message
for rows.Next() {
var msg Message
rows.Scan(&msg.Username, &msg.Message, &msg.Timestamp)
messages = append(messages, msg)
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(messages)
}