Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Gunakan go-zero untuk melaksanakan pengagihan dan penjadualan tugas teragih

Gunakan go-zero untuk melaksanakan pengagihan dan penjadualan tugas teragih

WBOY
WBOYasal
2023-06-22 09:06:382095semak imbas

Dengan perkembangan pesat perniagaan Internet dan volum perniagaan yang semakin meningkat secara beransur-ansur, jumlah data yang boleh dikendalikan oleh satu pelayan adalah jauh daripada memenuhi permintaan. Untuk memenuhi keperluan konkurensi tinggi, ketersediaan tinggi dan prestasi tinggi, seni bina teragih muncul mengikut keperluan masa.

Dalam seni bina teragih, pengagihan tugas dan penjadualan merupakan komponen yang sangat kritikal. Kualiti pengagihan tugas dan penjadualan secara langsung akan mempengaruhi prestasi dan kestabilan keseluruhan sistem. Di sini, kami akan memperkenalkan cara menggunakan rangka kerja go-zero untuk melaksanakan pengagihan dan penjadualan tugas teragih.

1. Pengagihan tugas teragih

Pengagihan tugas adalah untuk memperuntukkan tugasan untuk dilaksanakan kepada nod yang berbeza. Dalam persekitaran yang diedarkan, pengagihan tugas biasanya dilaksanakan melalui baris gilir mesej. Baris gilir mesej mempunyai ciri-ciri ketersediaan tinggi, tak segerak dan penyahgandingan, dan boleh menyelesaikan risiko dan ketidakpastian dalam proses pengagihan tugas dengan baik.

go-zero menyediakan sokongan untuk baris gilir mesej seperti rabbitmq dan kafka. Di sini kami mengambil rabbitmq sebagai contoh untuk memperkenalkan cara menggunakannya untuk mencapai pengagihan tugas teragih.

1.1 Pasang rabbitmq

Mula-mula kita perlu memasang rabbitmq Anda boleh merujuk kepada dokumentasi di laman web rasmi rabbitmq untuk pemasangan. Selepas pemasangan selesai, kita perlu mencipta vhost dan pengguna baharu dan menetapkan kebenaran.

# 创建 vhost
sudo rabbitmqctl add_vhost vhost-test

# 创建用户
sudo rabbitmqctl add_user user-test passwd-test

# 设置用户权限
sudo rabbitmqctl set_permissions -p vhost-test user-test ".*" ".*" ".*"

1.2 Konfigurasikan rabbitmq

Seterusnya, kita perlu menambah konfigurasi berkaitan rabbitmq dalam fail konfigurasi:

[message]
    # 是否启用message
    enable = true
    # message类型,支持multi、nsq、kafka、rabbitmq
    type = "rabbitmq"
    # rabbitmq地址(IP:PORT)
    addr = "localhost:5672"
    # rabbitmq账号
    user = "user-test"
    # rabbitmq密码
    password = "passwd-test"
    # rabbitmq虚拟主机(默认值:/)
    virtualhost = "vhost-test"
    # 消息队列名称
    queue = "test-queue"

1.3 Hantar tugas

dalam go-zero , kita boleh melaksanakan pengagihan tugas teragih melalui baris gilir mesej. Kami boleh menghantar mesej melalui baris gilir mesej, dan pengguna mesej akan mendapatkan semula mesej daripada baris gilir mesej dan melaksanakan tugas yang sepadan.

Di sini kami mengambil penghantaran e-mel sebagai contoh untuk memperkenalkan cara menghantar tugas:

func sendMail(ctx context.Context, req *types.SendMailRequest) error {
    // 将任务转为消息发送到消息队列中
    return message.SendMessage(ctx, "test-queue", &types.SendMailRequest{
        Email: req.Email,
        Title: req.Title,
        Content: req.Content,
    })
}

Dalam kaedah ini, kami menukar tugas e-mel menjadi mesej dan menghantar mesej ke baris gilir mesej melalui fungsi SendMessage.

2. Penjadualan tugas teragih

Penjadualan tugas teragih adalah untuk menetapkan tugasan kepada nod yang berbeza dan menjadualkannya. Dalam persekitaran yang diedarkan, penjadualan tugas biasanya dilakukan melalui sistem tugas berjadual seperti cron.

Rangka kerja go-zero menyediakan pakej cronexr, yang boleh memudahkan penjadualan tugas. Kita boleh menghuraikan ungkapan cron melalui pakej cronexpr dan kemudian melaksanakan tugas yang sepadan.

2.1 Tambah tugas

Kami boleh menambah tugasan pada sistem tugasan yang dijadualkan melalui fungsi seperti AddFunc dan AddJob, contohnya:

func startSchedule() {
    // 解析cron表达式,每天凌晨1点执行
    expr, err := cronexpr.Parse("0 0 1 * * *")
    if err != nil {
        log.Fatalf("failed to parse cron expression: %s", err.Error())
    }

    // 添加任务
    cron.Schedule(expr, cron.FuncJob(func() {
        // do something
    }))
}

Dalam contoh ini, kami menghuraikan awal pagi setiap hari Ungkapan cron dilaksanakan pada pukul 1, dan kemudian FuncJob telah ditambahkan pada sistem tugas yang dijadualkan.

2.2 Melaksanakan tugas

Sistem tugas berjadual akan memanggil fungsi yang sepadan dengan tugas untuk melaksanakan tugas. Kami boleh mengendalikan tugas dengan menulis fungsi pemprosesan yang sepadan, contohnya:

func handleMailTask() {
    // 监听消息队列
    message.ReceiveMessage(context.Background(),"test-queue", func(ctx context.Context, data []byte) error {
        var req types.SendMailRequest
        // 解析消息
        if err := json.Unmarshal(data, &req); err != nil {
            return err
        }

        // 发送邮件
        if err := sendMail(context.Background(), &req); err != nil {
            log.Printf("failed to send mail of %s: %s", req.Email, err.Error())
        }

        return nil
    })
}

Dalam fungsi pemprosesan ini, kami mendengar baris gilir mesej mesej, mendapatkan mesej dan menghuraikan tugas. Kemudian panggil fungsi sendMail untuk menghantar e-mel.

3. Ringkasan

Artikel ini memperkenalkan cara menggunakan rangka kerja go-zero untuk mencapai pengagihan tugasan dan penjadualan. Melalui baris gilir mesej dan sistem tugas berjadual, kami boleh merealisasikan pengagihan dan penjadualan tugas dengan mudah, serta meningkatkan prestasi dan ketersediaan sistem.

Atas ialah kandungan terperinci Gunakan go-zero untuk melaksanakan pengagihan dan penjadualan tugas teragih. 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