Rumah pembangunan bahagian belakang Golang Cara melaksanakan fungsi penjadualan tugas teragih dalam bahasa go

Cara melaksanakan fungsi penjadualan tugas teragih dalam bahasa go

Aug 25, 2023 pm 04:52 PM
Penjadualan tugas teragih Realisasi fungsi pergi pelaksanaan bahasa

Cara melaksanakan fungsi penjadualan tugas teragih dalam bahasa go

Cara melaksanakan penjadualan tugas teragih dalam bahasa Go

Dengan pembangunan berterusan Internet, sistem teragih menjadi semakin biasa apabila memproses tugasan berskala besar. Penjadualan tugas teragih ialah cara untuk mengagihkan tugas secara sama rata kepada berbilang mesin untuk dilaksanakan, yang boleh meningkatkan kecekapan pemprosesan tugas dan kebolehskalaan sistem. Artikel ini akan memperkenalkan cara melaksanakan penjadualan tugas teragih dalam bahasa Go dan memberikan contoh kod.

1. Memperkenalkan perpustakaan pihak ketiga

Kami boleh menggunakan perpustakaan pihak ketiga untuk memudahkan pelaksanaan penjadualan tugas teragih. Yang biasa digunakan termasuk:

  1. etcd: pangkalan data nilai kunci yang sangat tersedia yang boleh digunakan untuk kunci yang diedarkan dan pemilihan ketua.
  2. go-zookeeper: Pustaka pelanggan ZooKeeper dalam bahasa Go yang boleh digunakan untuk konfigurasi terpusat dan pemilihan ketua sistem teragih.
  3. nats: Perisian tengah berprestasi tinggi yang menyokong pemesejan dan boleh digunakan untuk menerbitkan dan melanggan mesej tugasan.

Dalam artikel ini, kami memilih untuk menggunakan etcd sebagai alat untuk kunci yang diedarkan dan pemilihan induk, dan nats sebagai alat untuk menerbitkan dan melanggan mesej tugasan.

2. Proses pelaksanaan

  1. Mulakan perkhidmatan: Setiap mesin perlu menjalankan perkhidmatan untuk menerima tugas dan mengagihkannya kepada mesin yang tersedia. Kita boleh menggunakan HTTP atau RPC untuk melaksanakan antara muka komunikasi.
  2. Daftar mesin: Apabila setiap mesin dimulakan, ia perlu mendaftarkan maklumatnya sendiri dengan etcd, termasuk alamat IP dan bilangan CPU yang tersedia.
  3. Pemilihan pemimpin: Gunakan mekanisme pemilihan pemimpin yang disediakan oleh etcd untuk memilih mesin sebagai ketua dan bertanggungjawab untuk penjadualan tugas.
  4. Agihkan tugas: Pemimpin mendapat tugas daripada baris gilir tugas dan mengagihkannya ke mesin lain berdasarkan bilangan CPU mesin yang tersedia. Pemimpin menghantar tugas ke mesin lain melalui nats.
  5. Laksanakan tugas: Mesin yang menerima tugas melaksanakan tugas dan kemudian menghantar hasil pelaksanaan kepada ketua.
  6. Selesaikan tugas: Selepas menerima keputusan pelaksanaan tugas, ketua mengemas kini status tugas. Jika tugasan gagal, ia boleh dicuba semula atau diagihkan semula mengikut dasar.
  7. Batalkan tugas: Batalkan tugas seperti yang diperlukan. Selepas mesin menerima permintaan pembatalan, ia menghentikan pelaksanaan tugas dan menetapkan status tugas kepada Dibatalkan.

3. Contoh Kod

Berikut ialah contoh kod ringkas yang menggunakan perpustakaan etcd dan nats untuk melaksanakan penjadualan tugasan teragih.

package main

import (
    "fmt"
    "log"
    "time"

    "github.com/coreos/etcd/client"
    "github.com/nats-io/nats"
)

var (
    natsServers = "nats://localhost:4222"
    etcdServers = []string{"http://localhost:2379"}
    etcdKey     = "/distributed_jobs"
)

func main() {
    // 连接到etcd
    cfg := client.Config{
        Endpoints: etcdServers,
        Transport: client.DefaultTransport,
    }
    c, err := client.New(cfg)
    if err != nil {
        log.Fatal(err)
    }
    kapi := client.NewKeysAPI(c)

    // 注册机器
    ip := "192.168.1.100" // 机器的IP地址
    cpu := 4              // 机器的可用CPU数
    err = registerMachine(kapi, ip, cpu)
    if err != nil {
        log.Fatal(err)
    }

    // 领导者选举
    isLeader, err := electLeader(kapi, ip)
    if err != nil {
        log.Fatal(err)
    }
    if isLeader {
        log.Println("I am the leader")
        // 作为领导者,监听任务队列,分发任务
        go watchJobQueue(kapi)
    } else {
        log.Println("I am not the leader")
        // 作为非领导者,接收任务并执行
        go runTask()
    }

    // 等待中断信号
    select {}
}

// 注册机器
func registerMachine(kapi client.KeysAPI, ip string, cpu int) error {
    _, err := kapi.CreateInOrder(kapi, etcdKey+"/"+ip, ip+":"+strconv.Itoa(cpu), 0)
    return err
}

// 领导者选举
func electLeader(kapi client.KeysAPI, ip string) (bool, error) {
    resp, err := kapi.Get(kapi, etcdKey+"/", &client.GetOptions{Sort: true, Recursive: false})
    if err != nil {
        return false, err
    }

    // 如果当前机器是最小的键值,选为领导者
    if len(resp.Node.Nodes) == 0 || resp.Node.Nodes[0].Key == etcdKey+"/"+ip {
        return true, nil
    }

    return false, nil
}

// 监听任务队列
func watchJobQueue(kapi client.KeysAPI) {
    watcher := kapi.Watcher(etcdKey, &client.WatcherOptions{Recursive: true})
    for {
        resp, err := watcher.Next(context.Background())
        if err != nil {
            log.Println(err)
            continue
        }

        // 领导者接收到任务,分发给其他机器
        job := resp.Node.Value
        err = dispatchJob(kapi, job)
        if err != nil {
            log.Println(err)
        }
    }
}

// 分发任务
func dispatchJob(kapi client.KeysAPI, job string) error {
    resp, err := kapi.Get(kapi, etcdKey, &client.GetOptions{Sort: true, Recursive: false})
    if err != nil {
        return err
    }

    for _, node := range resp.Node.Nodes {
        // 根据机器可用CPU数分配任务
        cpu, err := strconv.Atoi(node.Value)
        if err != nil {
            return err
        }

        if cpu > 0 {
            cpu--
            _, err = kapi.Set(kapi, node.Key, node.Value, 0)
            if err != nil {
                return err
            }

            // 发布任务消息
            err = publishJobMessage(job)
            if err != nil {
                return err
            }

            return nil
        }
    }

    return fmt.Errorf("No available machine to dispatch job")
}

// 发布任务消息
func publishJobMessage(job string) error {
    nc, err := nats.Connect(natsServers)
    if err != nil {
        return err
    }
    defer nc.Close()

    sub, err := nc.SubscribeSync(natsServers)
    if err != nil {
        return err
    }
    defer sub.Unsubscribe()

    err = nc.Publish(natsServers, []byte(job))
    if err != nil {
        return err
    }

    return nil
}

// 执行任务
func runTask() {
    nc, err := nats.Connect(natsServers)
    if err != nil {
        log.Fatal(err)
    }
    defer nc.Close()

    sub, err := nc.SubscribeSync(natsServers)
    if err != nil {
        log.Fatal(err)
    }
    defer sub.Unsubscribe()

    for {
        msg, err := sub.NextMsg(time.Second)
        if err != nil {
            log.Println(err)
            continue
        }

        // 执行任务
        runJob(msg.Data)

        // 将任务执行结果发送给领导者
        err = sendResult(msg.Data)
        if err != nil {
            log.Println(err)
        }
    }
}

// 执行任务
func runJob(job []byte) {
    // 执行具体任务逻辑
}

// 发送任务执行结果
func sendResult(job []byte) error {
    // 发送任务执行结果
}
Salin selepas log masuk

4 Ringkasan

Artikel ini memperkenalkan cara menggunakan bahasa Go untuk melaksanakan fungsi penjadualan tugas teragih, dan menyediakan contoh kod yang berkaitan. Dengan menggunakan etcd sebagai alat untuk kunci teragih dan pemilihan induk, dan nats sebagai alat penerbitan dan langganan untuk mesej tugas, kami boleh melaksanakan sistem penjadualan tugas teragih yang boleh dipercayai dan cekap.

Walau bagaimanapun, contoh kod di atas hanyalah pelaksanaan yang dipermudahkan, dan aplikasi sebenar mungkin perlu dilaraskan dan ditambah baik berdasarkan keadaan sebenar. Sebagai contoh, anda boleh menambah fungsi seperti mekanisme percubaan semula kegagalan tugas dan pembatalan tugas. Pada masa yang sama, sistem penjadualan tugas teragih perlu mempertimbangkan isu seperti kestabilan komunikasi rangkaian dan toleransi kesalahan untuk memastikan kebolehpercayaan sistem.

Saya harap artikel ini dapat membantu pembaca memahami cara melaksanakan fungsi penjadualan tugas teragih dalam bahasa Go, dan menyediakan beberapa rujukan untuk keperluan penjadualan tugas teragih pembaca dalam projek sebenar.

Atas ialah kandungan terperinci Cara melaksanakan fungsi penjadualan tugas teragih dalam bahasa go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk melaksanakan fungsi pratonton imej dalam uniapp Bagaimana untuk melaksanakan fungsi pratonton imej dalam uniapp Jul 04, 2023 am 10:36 AM

Cara melaksanakan fungsi pratonton imej dalam apl uni Pengenalan: Dalam pembangunan aplikasi mudah alih, pratonton imej ialah fungsi yang biasa digunakan. Dalam apl uni, kami boleh melaksanakan fungsi pratonton imej dengan menggunakan pemalam uni-ui atau komponen tersuai. Artikel ini akan memperkenalkan cara melaksanakan fungsi pratonton imej dalam apl uni, dengan contoh kod. 1. Gunakan pemalam uni-ui untuk melaksanakan fungsi pratonton imej uni-ui ialah perpustakaan komponen berdasarkan Vue.js yang dibangunkan oleh DCloud, yang menyediakan kumpulan UI yang kaya.

Pelaksanaan carta pai dan fungsi carta radar dalam carta statistik Vue Pelaksanaan carta pai dan fungsi carta radar dalam carta statistik Vue Aug 18, 2023 pm 12:28 PM

Pelaksanaan carta pai dan fungsi carta radar carta statistik Vue Pengenalan: Dengan perkembangan Internet, permintaan untuk analisis data dan paparan carta menjadi semakin mendesak. Sebagai rangka kerja JavaScript yang popular, Vue menyediakan banyak pemalam dan komponen visualisasi data untuk memudahkan pembangun melaksanakan pelbagai carta statistik dengan cepat. Artikel ini akan memperkenalkan cara menggunakan Vue untuk melaksanakan fungsi carta pai dan carta radar, serta menyediakan contoh kod yang berkaitan. Memperkenalkan pemalam carta statistik Dalam pembangunan Vue, kami boleh menggunakan beberapa pemalam carta statistik yang sangat baik untuk membantu kami melaksanakan

Applet WeChat melaksanakan fungsi muat naik imej Applet WeChat melaksanakan fungsi muat naik imej Nov 21, 2023 am 09:08 AM

Applet WeChat melaksanakan fungsi muat naik gambar Dengan perkembangan Internet mudah alih, applet WeChat telah menjadi bahagian yang amat diperlukan dalam kehidupan orang ramai. Program mini WeChat bukan sahaja menyediakan pelbagai senario aplikasi, tetapi juga menyokong fungsi yang ditentukan oleh pembangun, termasuk fungsi muat naik imej. Artikel ini akan memperkenalkan cara untuk melaksanakan fungsi muat naik imej dalam applet WeChat dan memberikan contoh kod khusus. 1. Kerja persediaan Sebelum mula menulis kod, kita perlu memuat turun dan memasang alat pembangun WeChat dan mendaftar sebagai pembangun WeChat. Pada masa yang sama, anda juga perlu memahami WeChat

Menggunakan Python dan Redis untuk melaksanakan penjadualan tugas teragih: cara melaksanakan tugas berjadual Menggunakan Python dan Redis untuk melaksanakan penjadualan tugas teragih: cara melaksanakan tugas berjadual Jul 30, 2023 am 09:01 AM

Melaksanakan penjadualan tugas teragih menggunakan Python dan Redis: Cara melaksanakan tugas berjadual Pengenalan: Dalam sistem teragih, penjadualan tugas adalah tugas penting. Untuk sistem berskala besar, untuk memastikan ketersediaan tinggi dan prestasi tinggi, penjadualan tugas memerlukan pemprosesan yang diedarkan. Artikel ini akan memperkenalkan cara menggunakan Python dan Redis untuk melaksanakan penjadualan tugas teragih dan secara khusus melaksanakan tugas berjadual. 1. Apa itu RedisRedis ialah sistem penyimpanan struktur data dalam memori sumber terbuka yang juga boleh digunakan sebagai cache dan broker mesej yang diedarkan.

Cara melaksanakan pengalihan laluan dalam bahasa Go Cara melaksanakan pengalihan laluan dalam bahasa Go Dec 17, 2023 am 08:26 AM

Cara melaksanakan pengalihan laluan dalam bahasa Go memerlukan contoh kod khusus Dalam pembangunan Web, penghalaan (Router) merujuk kepada proses menghuraikan pemproses yang sepadan (Pengendali) berdasarkan URL dan menyerahkannya kepada pemproses untuk memproses permintaan. Ubah hala merujuk kepada proses melompat permintaan pengguna dari satu URL ke URL lain dalam pelayan. Dalam bahasa Go, dengan menggunakan gin perpustakaan pihak ketiga berdasarkan pakej http, kita boleh dengan mudah

Cara menggunakan Laravel untuk melaksanakan fungsi pengurusan hak pengguna Cara menggunakan Laravel untuk melaksanakan fungsi pengurusan hak pengguna Nov 02, 2023 pm 02:09 PM

Cara menggunakan Laravel untuk melaksanakan fungsi pengurusan hak pengguna Dengan pembangunan aplikasi web, pengurusan hak pengguna telah menjadi semakin penting dalam banyak projek. Laravel, sebagai rangka kerja PHP yang popular, menyediakan banyak alat dan fungsi yang berkuasa untuk mengendalikan pengurusan hak pengguna. Artikel ini akan memperkenalkan cara menggunakan Laravel untuk melaksanakan fungsi pengurusan hak pengguna dan menyediakan contoh kod khusus. Reka bentuk pangkalan data Pertama, kita perlu mereka bentuk model pangkalan data untuk menyimpan perhubungan antara pengguna, peranan dan kebenaran. Untuk memudahkan urusan kami akan buat

PHP melaksanakan fungsi pengecaman pertuturan PHP melaksanakan fungsi pengecaman pertuturan Jun 22, 2023 am 08:59 AM

PHP melaksanakan fungsi pengecaman pertuturan Pengecaman pertuturan ialah teknologi yang menukar isyarat pertuturan kepada teks atau arahan yang sepadan Ia digunakan secara meluas dalam zaman maklumat moden. Sebagai bahasa pengaturcaraan Web yang biasa digunakan, PHP juga boleh melaksanakan fungsi pengecaman pertuturan dalam pelbagai cara, seperti menggunakan perpustakaan alat sumber terbuka atau antara muka API. Artikel ini akan memperkenalkan kaedah asas menggunakan PHP untuk melaksanakan pengecaman pertuturan, dan juga menyediakan beberapa perpustakaan alat yang biasa digunakan dan antara muka API untuk memudahkan pembaca memilih penyelesaian yang sesuai dalam pembangunan sebenar. 1. Asas pengecaman pertuturan PHP

Cara melaksanakan lebihan beban operator dalam bahasa Go Cara melaksanakan lebihan beban operator dalam bahasa Go Feb 19, 2024 pm 05:05 PM

Bahasa Go ialah bahasa pengaturcaraan yang terkenal dengan kesederhanaan, kecekapan dan kuasanya. Ia tidak menyokong beban berlebihan operator. Lebih muatan operator bermakna apabila menjalankan operasi pada jenis data yang ditentukan pengguna, pengendali boleh dibebankan untuk mencapai fungsi yang sepadan. Dalam bahasa Go, walaupun beban operator langsung tidak disokong, kami boleh mencapai kefungsian yang sama dengan mentakrifkan kaedah. Untuk melaksanakan fungsi yang serupa dengan lebihan beban operator, anda boleh menggunakan antara muka dan kaedah bahasa Go. Antara muka digunakan untuk menentukan tingkah laku, manakala kaedah digunakan untuk melaksanakan jenis tingkah laku tertentu. Seterusnya, saya akan perincikan

See all articles