Maison  >  Article  >  développement back-end  >  Modèle de publication de messages et d'abonnement en langage Go

Modèle de publication de messages et d'abonnement en langage Go

王林
王林original
2023-06-01 09:21:291385parcourir

Avec le développement continu des applications modernes et la demande croissante, de plus en plus de développeurs commencent à tourner leur attention vers le mécanisme de messagerie. Dans ce cas, il existe un type de modèle de message qui préoccupe de nombreux développeurs, c’est le modèle de publication et d’abonnement de messages. Ce modèle implémente la transmission de messages de manière simple et efficace et est largement utilisé dans les architectures distribuées. Dans ce modèle, le langage Go possède également sa propre méthode d’implémentation unique.

Cet article présentera le modèle de publication et d'abonnement de messages en langage Go, y compris comment utiliser les canaux en langage Go pour implémenter et utiliser le modèle de publication et d'abonnement de messages, et comment implémenter une simple file d'attente de messages en langage Go.

1. Introduction aux canaux du langage Go

Channel est un mécanisme utilisé pour réaliser une communication simultanée dans le langage Go. Les canaux fournissent un moyen de transférer des données entre différentes goroutines (coroutines) et peuvent être utilisés pour synchroniser l'exécution entre les goroutines. Les canaux qui transmettent des données d'une goroutine à une autre sont thread-safe et peuvent éviter les conditions de concurrence.

En langage Go, utilisez la fonction make pour créer une chaîne. La syntaxe de la fonction make est la suivante :

make(chan T)

Parmi eux, T représente le type d'élément dans le Channel. Par exemple, pour créer un Channel qui délivre des types entiers, vous pouvez utiliser le code suivant :

ch := make(chan int)

2. Implémentation de modèles de publication de messages et d'abonnement en langage Go

La méthode d'implémentation de modèles de publication de messages et d'abonnement en langage Go est très simple, utilisez simplement Just Channel. Les exemples de codes de modèle de publication de messages et d'abonnement recommandés en langage Go sont les suivants :

package main

import (
    "fmt"
)

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)

    go func() {
        for {
            str := <-ch1
            ch2 <- "go " + str
        }
    }()

    for i := 0; i < 5; i++ {
        ch1 <- fmt.Sprintf("message %d", i)
    }

    for i := 0; i < 5; i++ {
        fmt.Println(<-ch2)
    }
}

Le bloc de code ci-dessus utilise deux canaux : ch1 et ch2. Nous avons défini une goroutine chargée de lire les messages de ch1, de les convertir en chaînes et de les préfixer avec "go", puis d'envoyer ces nouveaux messages via ch2. Ensuite, nous générons quelques messages dans la goroutine principale et les envoyons à ch1, puis nous recevons et imprimons ces nouveaux messages depuis ch2. Cette méthode est un moyen courant d’implémenter des modèles de publication de messages et d’abonnement dans le langage Go.

3. Implémentation d'une file d'attente de messages simple en langage Go

Il est également très simple d'implémenter une file d'attente de messages simple en langage Go. Il vous suffit d'utiliser Channel et goroutine.

Tout d'abord, nous définissons un type de file d'attente :

type Queue struct {
    items []string
    lock  sync.Mutex
    ch    chan bool
}

Ce type de file d'attente a trois variables membres importantes : items, lock et ch. Parmi eux, les éléments sont utilisés pour stocker les messages dans la file d'attente, le verrou est utilisé pour protéger les opérations d'écriture et de lecture de la file d'attente et ch est utilisé pour informer la file d'attente que de nouveaux messages sont arrivés. La notification est implémentée en envoyant une valeur booléenne au canal.

Nous devons également définir une méthode pour ajouter des messages à la file d'attente :

func (q *Queue) Add(item string) {
    q.lock.Lock()
    defer q.lock.Unlock()

    q.items = append(q.items, item)
    q.ch <- true
}

Cette méthode est thread-safe et peut éviter les conditions de concurrence. Il acquiert d'abord le verrou de la file d'attente, puis ajoute le message à la file d'attente et enfin envoie une valeur booléenne au canal.

Nous devons également définir une méthode pour récupérer les messages pour la file d'attente :

func (q *Queue) Get() (string, bool) {
    q.lock.Lock()
    defer q.lock.Unlock()

    if len(q.items) == 0 {
        return "", false
    }

    item := q.items[0]
    q.items = q.items[1:]

    return item, true
}

Cette méthode est également thread-safe. Elle acquiert d'abord le verrou de la file d'attente, puis vérifie si la file d'attente est vide et renvoie false si la file d'attente. est vide. Sinon, il reçoit un message du début de la file d'attente, supprime l'élément head et renvoie le message ainsi qu'une valeur vraie.

L'exemple de code pour utiliser cette file d'attente est le suivant :

package main

import (
    "fmt"
    "time"
)

func main() {
    q := Queue{
        items: []string{},
        ch:    make(chan bool),
    }

    // 启动一个goroutine更新队列
    go func() {
        for {
            select {
            case <-q.ch:
                for {
                    item, ok := q.Get()
                    if !ok {
                        break
                    }
                    fmt.Println(item)
                }
            }
        }
    }()

    // 向队列中添加一些消息
    for i := 0; i < 5; i++ {
        q.Add(fmt.Sprintf("message %d", i))
        time.Sleep(time.Second)
    }
}

Dans le code ci-dessus, nous définissons une variable q de type Queue, puis démarrons une goroutine pour la mettre à jour, et enfin ajoutons quelques messages à la file d'attente. La goroutine utilise l'instruction select pour obtenir des notifications de messages du canal, récupère tous les messages de la file d'attente et les imprime.

Résumé

Le modèle de publication et d'abonnement de messages en langage Go est très simple et efficace, et présente une sécurité naturelle des threads grâce à l'utilisation de canaux. Cet article explique comment implémenter le modèle de publication et d'abonnement de messages en langage Go, et comment implémenter une file d'attente de messages simple en langage Go. Après avoir appris ces contenus, vous pouvez les utiliser pour implémenter diverses tâches de traitement asynchrone et améliorer les performances de concurrence du programme.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn