Rumah >pembangunan bahagian belakang >Golang >Amalan terbaik untuk melaksanakan penyelesaian yang cekap untuk penjadualan tugas teragih dan pelaksanaan dengan Golang dan RabbitMQ
Tajuk: Golang dan RabbitMQ melaksanakan amalan terbaik untuk penjadualan dan pelaksanaan tugas teragih
Pengenalan:
Dalam persekitaran pengkomputeran moden, penjadualan dan pelaksanaan tugas teragih merupakan teknologi yang sangat penting. Golang, sebagai bahasa pengaturcaraan yang berkuasa dan cekap, digabungkan dengan RabbitMQ sebagai sistem baris gilir mesej yang boleh dipercayai, boleh memberikan penyelesaian yang sangat baik. Artikel ini akan memperkenalkan cara menggunakan Golang dan RabbitMQ untuk mencapai penjadualan dan pelaksanaan tugas teragih yang cekap, serta menyediakan contoh kod khusus.
import ( "fmt" "log" "github.com/streadway/amqp" )
Seterusnya, kami mencipta fungsi sambungan untuk nod penjadualan tugas dan memulakan objek sambungan RabbitMQ dan objek saluran.
func createSchedulerConn() (*amqp.Connection, *amqp.Channel, error) { conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") // RabbitMQ连接地址和认证信息 if err != nil { return nil, nil, err } ch, err := conn.Channel() if err != nil { return nil, nil, err } return conn, ch, nil }
Kita kemudian boleh membuat sambungan dan saluran dengan memanggil fungsi di atas.
conn, ch, err := createSchedulerConn() if err != nil { log.Fatalf("Failed to create scheduler connection and channel: %v", err) } defer conn.Close() defer ch.Close()
Seterusnya, kita perlu mencipta baris gilir penjadualan tugas dan baris gilir hasil.
queueName := "task_queue" resultQueueName := "result_queue" _, err = ch.QueueDeclare( queueName, true, false, false, false, nil, ) _, err = ch.QueueDeclare( resultQueueName, true, false, false, false, nil, )
Pada masa ini, nod penjadualan tugasan sedia untuk menerima tugasan.
import ( "fmt" "log" "github.com/streadway/amqp" )
Seterusnya, kami mencipta fungsi sambungan yang melaksanakan nod dan memulakan sambungan dan saluran.
func createWorkerConn() (*amqp.Connection, *amqp.Channel, error) { conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") // RabbitMQ连接地址和认证信息 if err != nil { return nil, nil, err } ch, err := conn.Channel() if err != nil { return nil, nil, err } return conn, ch, nil }
Kita kemudian boleh membuat sambungan dan saluran dengan memanggil fungsi di atas.
conn, ch, err := createWorkerConn() if err != nil { log.Fatalf("Failed to create worker connection and channel: %v", err) } defer conn.Close() defer ch.Close()
Pada ketika ini, nod pelaksanaan bersedia untuk menerima tugas dan melaksanakannya.
body := "Hello, world!" err = ch.Publish( "", queueName, false, false, amqp.Publishing{ ContentType: "text/plain", Body: []byte(body), }) if err != nil { log.Fatalf("Failed to publish task: %v", err) }
Pada masa ini, tugasan telah diposkan ke baris gilir penjadualan tugas.
msgs, err := ch.Consume( queueName, "", false, false, false, false, nil, ) if err != nil { log.Fatalf("Failed to register a consumer: %v", err) } for msg := range msgs { // 处理任务 result := processTask(msg.Body) // 将结果发送到结果队列中 err = ch.Publish( "", resultQueueName, false, false, amqp.Publishing{ ContentType: "text/plain", Body: []byte(result), }) if err != nil { log.Fatalf("Failed to publish result: %v", err) } // 确认任务已完成 msg.Ack(false) }
Melalui kod di atas, nod pelaksanaan boleh terus menerima tugasan dan melaksanakannya, dan kemudian menerbitkan keputusan ke baris gilir hasil.
msgs, err := ch.Consume( resultQueueName, "", true, false, false, false, nil, ) if err != nil { log.Fatalf("Failed to register a consumer: %v", err) } for msg := range msgs { // 处理结果 fmt.Println(string(msg.Body)) }
Melalui kod di atas, nod penjadualan tugas boleh mendapatkan hasil pelaksanaan tugas.
Rujukan:
Atas ialah kandungan terperinci Amalan terbaik untuk melaksanakan penyelesaian yang cekap untuk penjadualan tugas teragih dan pelaksanaan dengan Golang dan RabbitMQ. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!