Maison >développement back-end >Golang >Comment utiliser la file d'attente de messages dans Go ?
La file d'attente de messages est un modèle d'architecture système courant, qui joue un rôle extrêmement important dans la gestion d'une concurrence élevée et du traitement des tâches asynchrones. Dans le langage Go, grâce à certaines bibliothèques et outils de files d'attente de messages open source, l'utilisation des files d'attente de messages est devenue très pratique et simple.
Cet article explique comment utiliser les files d'attente de messages dans Go, notamment les éléments suivants :
# 🎜🎜#
RabbitMQ : RabbitMQ est un système de file d'attente de messages open source qui prend en charge plusieurs protocoles et langages de programmation, tels que AMQP, STOMP, MQTT, etc. Les développeurs peuvent y accéder via différents langages clients, tels que Go, Java , Python, etc. RabbitMQ est écrit en langage Erlang et est largement utilisé pour prendre en charge des scénarios de traitement en temps réel tels que l'IoT, les discussions de groupe et la surveillance. Apache Kafka : Apache Kafka est un système de file d'attente de messages basé sur le modèle de publication/abonnement. Il a été développé par LinkedIn et est principalement utilisé pour gérer le traitement continu des données en streaming. Kafka distribue les messages via plusieurs partitions pour prendre en charge un débit élevé et une évolutivité élevée. ActiveMQ : ActiveMQ est un système de file d'attente de messages populaire basé sur JMS qui prend en charge plusieurs protocoles de transmission et accès à des langages de programmation, tels que AMQP, STOMP, Openwire, etc.Install RabbitMQ
Install RabbitMQ, télécharger depuis le site officiel Adresse : https://www.rabbitmq.com/download.html ; Configurer RabbitMQ Après l'installation, entrez dans le répertoire bin (veuillez ignorer le suffixe .bat pour les non-Windows. plates-formes) et exécutez : ./rabbitmqctl start, Start RabbitMQ ; Créez un hôte virtuel MQ, exécutez : ./rabbitmqctl add_vhost test ; Ajoutez des utilisateurs et attribuez des autorisations, exécutez : ./rabbitmqctl add_user test test, ./rabbitmqctl set_permissions -p test test ".func main() { spider() } func spider() { url := "https://www.example.com" doc, _ := goquery.NewDocument(url) doc.Find(".img_wrapper img").Each(func(i int, s *goquery.Selection) { imgUrl, _ := s.Attr("src") publishToMQ(imgUrl) }) } func publishToMQ(msg string) { conn, err := amqp.Dial("amqp://test:test@localhost:5672/test") failOnError(err, "Failed to connect to RabbitMQ") defer conn.Close() ch, err := conn.Channel() failOnError(err, "Failed to open a channel") defer ch.Close() q, err := ch.QueueDeclare( "image_downloader", // name true, // durable false, // delete when unused false, // exclusive false, // no-wait nil, // arguments ) failOnError(err, "Failed to declare a queue") err = ch.Publish( "", // exchange q.Name, // routing key false, // mandatory false, // immediate amqp.Publishing{ ContentType: "text/plain", Body: []byte(msg), }) failOnError(err, "Failed to publish a message") log.Printf(" [x] Sent %s", msg) }
Ensuite, écrivez le téléchargeur d'images. En écoutant la file d'attente de messages de RabbitMQ, le téléchargement d'images asynchrone est obtenu :
func main() { consumeMQ() } func consumeMQ() { conn, err := amqp.Dial("amqp://test:test@localhost:5672/test") failOnError(err, "Failed to connect to RabbitMQ") defer conn.Close() ch, err := conn.Channel() failOnError(err, "Failed to open a channel") defer ch.Close() q, err := ch.QueueDeclare( "image_downloader", // name true, // durable false, // delete when unused false, // exclusive false, // no-wait nil, // arguments ) failOnError(err, "Failed to declare a queue") msgs, err := ch.Consume( q.Name, // queue "", // consumer true, // auto-ack false, // exclusive false, // no-local false, // no-wait nil, // args ) failOnError(err, "Failed to register a consumer") forever := make(chan bool) go func() { for d := range msgs { log.Printf("Received a message: %s", d.Body) downloadImage(string(d.Body)) } }() log.Printf(" [*] Waiting for messages. To exit press CTRL+C") <-forever } func downloadImage(url string) { resp, err := http.Get(url) if err != nil { log.Fatal(err) } defer resp.Body.Close() file, err := os.Create(uuid.New().String() + ".jpg") if err != nil { log.Fatal(err) } defer file.Close() _, err = io.Copy(file, resp.Body) if err != nil { log.Fatal(err) } log.Printf("Downloaded an image: %s", url) }
Dans le code ci-dessus, nous avons créé une file d'attente de travail "image-downloader" après que le producteur ait analysé l'adresse de l'image du html. page, cela fonctionne. Envoyez des messages dans la file d'attente. Le consommateur écoutera la file d'attente de travail et, après avoir reçu le message, appellera la fonction downloadImage pour télécharger le fichier image.
L'exemple ci-dessus est un cas d'utilisation simple utilisant RabbitMQ. L'utilisation d'autres bibliothèques de files d'attente de messages est similaire, il vous suffit d'implémenter des connexions et des opérations via différentes API.
Overview
Dans cet article, nous présentons et expliquons ce qu'est une file d'attente de messages Dans un grand nombre de scénarios de traitement de données, la consommation asynchrone est essentielle. Le langage Go rend le traitement des tâches asynchrones simple et efficace grâce à son propre mécanisme de coroutine. Couplé aux riches bibliothèques open source du langage Go lui-même, il devient extrêmement simple d'utiliser des files d'attente de messages pour implémenter un traitement de messages asynchrone.
À travers les exemples ci-dessus, nous pouvons voir que lors de la mise en œuvre d'un traitement de tâches asynchrone, l'utilisation de files d'attente de messages peut considérablement améliorer l'efficacité du traitement, et l'utilisation de files d'attente de messages en langage Go est également très pratique. Dans les projets, il est recommandé d'utiliser des bibliothèques de files d'attente de messages open source, telles que RabbitMQ ou Apache Kafka.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!