Rumah > pembangunan bahagian belakang > Golang > Bina perkhidmatan tolakan serentak berprestasi tinggi menggunakan Go dan Goroutines

Bina perkhidmatan tolakan serentak berprestasi tinggi menggunakan Go dan Goroutines

PHPz
Lepaskan: 2023-07-21 19:17:27
asal
569 orang telah melayarinya

Bina perkhidmatan tolakan serentak berprestasi tinggi menggunakan Go dan Goroutines

Pengenalan:
Dengan pembangunan aplikasi web, tolakan data masa nyata telah menjadi ciri yang amat diperlukan dalam aplikasi web moden. Melalui tolakan masa nyata, aplikasi boleh menghantar mesej dan kemas kini dengan cepat kepada pelanggan, memberikan pengalaman pengguna yang lebih baik. Artikel ini akan memperkenalkan cara menggunakan bahasa Go dan Goroutines untuk membina perkhidmatan tolakan serentak berprestasi tinggi.

Bahasa Go ialah bahasa pengaturcaraan sumber terbuka, berprestasi tinggi Model konkurensi dan ciri Goroutines menjadikannya sangat sesuai untuk membina aplikasi masa nyata berprestasi tinggi.

Langkah 1: Persediaan sisi pelayan

Pertama, kita perlu membina bahagian pelayan untuk mengendalikan sambungan pelanggan dan tolakan mesej. Kami menggunakan pakej bersih bahasa Go untuk mencipta pelayan TCP mudah.

package main

import (
    "fmt"
    "log"
    "net"
)

func main() {
    // 创建监听地址
    listener, err := net.Listen("tcp", "localhost:8000")
    if err != nil {
        log.Fatal(err)
    }

    // 接收新的连接
    for {
        conn, err := listener.Accept()
        if err != nil {
            log.Fatal(err)
        }

        go handleConn(conn)
    }
}

func handleConn(conn net.Conn) {
    defer conn.Close()

    // 处理消息推送
    // TODO: 实现你的推送逻辑
}
Salin selepas log masuk

Dalam kod di atas, kami mencipta pelayan TCP dan mendengar pada port 8000. Apabila sambungan baharu tiba, kami menggunakan Goroutine untuk mengendalikan setiap sambungan bagi mencapai perkhidmatan tolakan serentak tinggi.

Langkah 2: Tolak serentak

Dalam fungsi handleConn(), kita boleh menulis logik tolak tertentu. Untuk melaksanakan siaran mesej antara pelanggan, kami boleh menggunakan saluran mesej global untuk menghantar mesej. handleConn()函数中,我们可以编写具体的推送逻辑。为了在客户端之间实现消息广播,我们可以使用一个全局的message通道来传递消息。

var message = make(chan string)

func main() {
    // ...

    // 消息广播
    go broadcast()

    // ...
}

// 广播消息
func broadcast() {
    // 存储连接的客户端
    clients := make(map[net.Conn]bool)

    for {
        select {
        case msg := <-message:
            // 向所有客户端发送消息
            for client := range clients {
                _, err := client.Write([]byte(msg))
                if err != nil {
                    log.Printf("Error sending message to client: %v
", err)
                    client.Close()
                    delete(clients, client)
                }
            }
        }
    }
}
Salin selepas log masuk

在上述代码中,我们创建了一个全局的message通道,并使用Goroutine来处理消息广播。我们还使用一个clients映射来存储连接的客户端。当有新的消息到达时,我们遍历所有客户端,并向它们发送消息。

步骤3: 客户端连接

现在,我们已经实现了服务器端的推送逻辑,接下来需要编写客户端代码。我们使用Go语言的net包来创建一个TCP连接,并在不同的Goroutine中处理读写操作。

package main

import (
    "bufio"
    "fmt"
    "log"
    "net"
    "os"
)

func main() {
    conn, err := net.Dial("tcp", "localhost:8000")
    if err != nil {
        log.Fatal(err)
    }

    go handleReader(conn) // 处理读取消息
    go handleWriter(conn) // 处理发送消息

    // 阻塞主线程
    <-make(chan struct{})
}

func handleReader(conn net.Conn) {
    reader := bufio.NewReader(conn)

    for {
        msg, err := reader.ReadString('
')
        if err != nil {
            log.Printf("Error reading message: %v
", err)
            conn.Close()
            break
        }

        fmt.Println("Received:", msg)
    }
}

func handleWriter(conn net.Conn) {
    scanner := bufio.NewScanner(os.Stdin)

    for scanner.Scan() {
        msg := scanner.Text()

        _, err := conn.Write([]byte(msg + "
"))
        if err != nil {
            log.Printf("Error sending message: %v
", err)
            conn.Close()
            break
        }
    }
}
Salin selepas log masuk

在上述代码中,我们创建了一个TCP连接,并在不同的Goroutine中处理读取和发送消息。handleReader()函数从服务器端读取数据并输出到控制台,handleWriter()函数从输入读取数据并发送到服务器端。

结论:
使用Go语言和Goroutines构建高性能的并发推送服务非常简单。通过使用Goroutines处理每个连接,我们可以实现高并发的消息推送。同时,通过使用channelrrreee

Dalam kod di atas, kami mencipta saluran mesej global dan menggunakan Goroutine untuk mengendalikan penyiaran mesej. Kami juga menggunakan peta clients untuk menyimpan klien yang disambungkan. Apabila mesej baharu tiba, kami mengulangi semua pelanggan dan menghantar mesej itu kepada mereka. 🎜🎜Langkah 3: Sambungan pelanggan🎜🎜Sekarang kami telah melaksanakan logik tolak sisi pelayan, kami perlu menulis kod klien. Kami menggunakan pakej bersih bahasa Go untuk membuat sambungan TCP dan mengendalikan operasi baca dan tulis dalam Goroutine yang berbeza. 🎜rrreee🎜Dalam kod di atas, kami mencipta sambungan TCP dan mengendalikan membaca dan menghantar mesej dalam Goroutine yang berbeza. Fungsi handleReader() membaca data daripada pelayan dan mengeluarkannya ke konsol, dan fungsi handleWriter() membaca data daripada input dan menghantarnya ke pelayan. 🎜🎜Kesimpulan: 🎜Sangat mudah untuk membina perkhidmatan tolakan serentak berprestasi tinggi menggunakan bahasa Go dan Goroutines. Dengan menggunakan Goroutines untuk mengendalikan setiap sambungan, kami boleh mencapai tolakan mesej yang sangat serentak. Pada masa yang sama, dengan menggunakan channel untuk menghantar mesej, kami boleh melaksanakan fungsi penyiaran mesej. Menggunakan pendekatan ini, kami boleh membina aplikasi masa nyata berprestasi tinggi dan berkonkurensi tinggi. 🎜

Atas ialah kandungan terperinci Bina perkhidmatan tolakan serentak berprestasi tinggi menggunakan Go dan Goroutines. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan