Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bina sistem pemesejan serentak yang sangat berskala menggunakan Go dan Goroutines

Bina sistem pemesejan serentak yang sangat berskala menggunakan Go dan Goroutines

王林
王林asal
2023-07-21 14:21:111404semak imbas

Gunakan Go dan Goroutines untuk membina sistem pemesejan serentak berskala tinggi

Pengenalan:
Dengan perkembangan pesat Internet dan teknologi mudah alih, permintaan untuk sistem pemesejan serentak berskala besar semakin meningkat dari hari ke hari. Membina sistem pemesejan serentak yang sangat berskala adalah cabaran penting yang dihadapi oleh pembangun perisian moden. Dalam artikel ini, kami akan memperkenalkan cara menggunakan bahasa Go dan Goroutines untuk membina sistem pemesejan serentak yang sangat berskala dan menyediakan kod sampel sebagai rujukan.

1 Pengenalan kepada bahasa Go dan bahasa Goroutines
Go ialah bahasa pengaturcaraan dengan jenis statik, konkurensi tinggi, pengumpulan sampah dan keselamatan memori. Ia telah menjadi bahasa pilihan bagi banyak pembangun dengan sintaksnya yang ringkas dan ciri konkurensi yang berkuasa. Goroutines ialah utas ringan yang disediakan oleh bahasa Go yang boleh melaksanakan berbilang fungsi serentak dalam ruang alamat yang sama. Goroutine berkomunikasi melalui saluran untuk mencapai kerjasama dalam senario serentak.

2. Rangka kerja asas untuk membina sistem pemesejan serentak
Rangka kerja asas untuk membina sistem pemesejan serentak terdiri daripada tiga komponen teras: pengeluar mesej, baris gilir mesej dan pengguna mesej. Pengeluar mesej bertanggungjawab untuk menjana mesej dan menghantarnya ke baris gilir mesej, baris gilir mesej bertanggungjawab untuk menerima dan menyimpan mesej, dan pengguna mesej memperoleh mesej daripada baris gilir mesej dan memprosesnya.

Berikut ialah contoh kod untuk membina sistem pemesejan serentak menggunakan bahasa Go dan Goroutines:

package main

import (
    "fmt"
)

type Message struct {
    id      int
    content string
}

func producer(messages chan<- Message) {
    for i := 0; i < 10; i++ {
        message := Message{
            id:      i,
            content: fmt.Sprintf("Message %d", i),
        }
        messages <- message
    }
    close(messages)
}

func consumer(id int, messages <-chan Message) {
    for message := range messages {
        fmt.Printf("Consumer %d: Received message %d - %s
", id, message.id, message.content)
    }
}

func main() {
    messages := make(chan Message)

    go producer(messages)

    for i := 0; i < 3; i++ {
        go consumer(i, messages)
    }

    for {
        // 主goroutine等待所有消费者处理完成
    }
}

Dalam kod contoh di atas, kami mentakrifkan struktur Mesej untuk mewakili kandungan dan ID mesej. Dalam fungsi pengeluar, kami menggunakan gelung for untuk menjana 10 mesej dan menghantarnya ke baris gilir mesej melalui saluran mesej (mesej). Dalam fungsi pengguna, kami memperoleh dan memproses mesej daripada saluran mesej melalui pernyataan julat. Dalam fungsi utama, kami mencipta saluran mesej (mesej) dan menggunakan goroutine untuk memulakan satu pengeluar dan tiga pengguna masing-masing. Gelung akhir untuk digunakan untuk membuat goroutine utama menunggu untuk semua pemprosesan pengguna selesai.

3. Penambahbaikan dalam skalabiliti tinggi
Kod contoh di atas melaksanakan sistem pemesejan serentak asas, tetapi ia mungkin menghadapi kesesakan prestasi apabila menghadapi sejumlah besar mesej dan pengguna. Untuk mencapai kebolehskalaan yang tinggi, kami boleh memperkenalkan berbilang baris gilir mesej dan berbilang kumpulan pengguna.

Berikut ialah kod sampel yang dipertingkatkan:

package main

import (
    "fmt"
    "sync"
)

type Message struct {
    id      int
    content string
}

func producer(messages []chan<- Message) {
    for i := 0; i < 10; i++ {
        message := Message{
            id:      i,
            content: fmt.Sprintf("Message %d", i),
        }
        for _, ch := range messages {
            ch <- message
        }
    }
}

func consumer(id int, wg *sync.WaitGroup, messages <-chan Message) {
    defer wg.Done()

    for message := range messages {
        fmt.Printf("Consumer %d: Received message %d - %s
", id, message.id, message.content)
    }
}

func main() {
    var wg sync.WaitGroup

    numQueues := 3
    numConsumersPerQueue := 2

    messages := make([]chan Message, numQueues)

    for i := 0; i < numQueues; i++ {
        messages[i] = make(chan Message)
        for j := 0; j < numConsumersPerQueue; j++ {
            wg.Add(1)
            go consumer(j, &wg, messages[i])
        }
    }

    go producer(messages)

    wg.Wait()
}

Dalam kod sampel yang dipertingkatkan, kami mencipta berbilang baris gilir mesej dan berbilang kumpulan pengguna (satu baris gilir mesej sepadan dengan satu kumpulan pengguna), dan menggunakan penyegerakan.WaitGroup untuk Memastikan semua pemprosesan pengguna adalah lengkap. Pengeluar menghantar setiap mesej ke semua baris gilir mesej, dan setiap pengguna dalam kumpulan pengguna memperoleh mesej daripada baris gilir mesej yang sepadan untuk diproses.

Kesimpulan:
Dengan menggunakan bahasa Go dan Goroutines untuk membina sistem pemesejan serentak, kami boleh dengan mudah mencapai pemprosesan mesej berskala tinggi. Dengan memperuntukkan baris gilir mesej dan kumpulan pengguna dengan betul, kami boleh mengoptimumkan prestasi dan penggunaan sumber untuk memenuhi keperluan sistem pemesejan serentak berskala besar.

Rujukan:
[1] The Go Programming Language - https://golang.org/
[2] Goroutines - https://tour.golang.org/concurrency/1

Atas ialah kandungan terperinci Bina sistem pemesejan serentak yang sangat berskala menggunakan Go dan Goroutines. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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