Maison  >  Article  >  développement back-end  >  Créez un service push simultané hautes performances à l'aide de Go et Goroutines

Créez un service push simultané hautes performances à l'aide de Go et Goroutines

PHPz
PHPzoriginal
2023-07-21 19:17:27500parcourir

Créez un service push simultané hautes performances à l'aide de Go et Goroutines

Introduction :
Avec le développement d'applications Web, le push de données en temps réel est devenu une fonctionnalité indispensable dans les applications Web modernes. Grâce au push en temps réel, les applications peuvent rapidement transmettre des messages et des mises à jour aux clients, offrant ainsi une meilleure expérience utilisateur. Cet article explique comment utiliser le langage Go et Goroutines pour créer un service push simultané hautes performances.

Le langage Go est un langage de programmation open source hautes performances. Son modèle de concurrence et ses fonctionnalités Goroutines le rendent très approprié pour créer des applications en temps réel hautes performances.

Étape 1 : Configuration côté serveur

Tout d'abord, nous devons créer un côté serveur pour gérer les connexions client et l'envoi de messages. Nous utilisons le package net du langage Go pour créer un simple serveur TCP.

package main

import (
    "fmt"
    "log"
    "net"
)

func main() {
    // 创建监听地址
    listener, err := net.Listen("tcp", "localhost:8000")
    if err != nil {
        log.Fatal(err)
    }

    // 接收新的连接
    for {
        conn, err := listener.Accept()
        if err != nil {
            log.Fatal(err)
        }

        go handleConn(conn)
    }
}

func handleConn(conn net.Conn) {
    defer conn.Close()

    // 处理消息推送
    // TODO: 实现你的推送逻辑
}

Dans le code ci-dessus, nous avons créé un serveur TCP et écouté sur le port 8000. Lorsqu'une nouvelle connexion arrive, nous utilisons Goroutine pour gérer chaque connexion afin d'obtenir un service push à haute concurrence.

Étape 2 : Push simultané

Dans la fonction handleConn(), nous pouvons écrire une logique push spécifique. Afin d'implémenter la diffusion de messages entre clients, nous pouvons utiliser un canal global message pour transmettre les messages. handleConn()函数中,我们可以编写具体的推送逻辑。为了在客户端之间实现消息广播,我们可以使用一个全局的message通道来传递消息。

var message = make(chan string)

func main() {
    // ...

    // 消息广播
    go broadcast()

    // ...
}

// 广播消息
func broadcast() {
    // 存储连接的客户端
    clients := make(map[net.Conn]bool)

    for {
        select {
        case msg := <-message:
            // 向所有客户端发送消息
            for client := range clients {
                _, err := client.Write([]byte(msg))
                if err != nil {
                    log.Printf("Error sending message to client: %v
", err)
                    client.Close()
                    delete(clients, client)
                }
            }
        }
    }
}

在上述代码中,我们创建了一个全局的message通道,并使用Goroutine来处理消息广播。我们还使用一个clients映射来存储连接的客户端。当有新的消息到达时,我们遍历所有客户端,并向它们发送消息。

步骤3: 客户端连接

现在,我们已经实现了服务器端的推送逻辑,接下来需要编写客户端代码。我们使用Go语言的net包来创建一个TCP连接,并在不同的Goroutine中处理读写操作。

package main

import (
    "bufio"
    "fmt"
    "log"
    "net"
    "os"
)

func main() {
    conn, err := net.Dial("tcp", "localhost:8000")
    if err != nil {
        log.Fatal(err)
    }

    go handleReader(conn) // 处理读取消息
    go handleWriter(conn) // 处理发送消息

    // 阻塞主线程
    <-make(chan struct{})
}

func handleReader(conn net.Conn) {
    reader := bufio.NewReader(conn)

    for {
        msg, err := reader.ReadString('
')
        if err != nil {
            log.Printf("Error reading message: %v
", err)
            conn.Close()
            break
        }

        fmt.Println("Received:", msg)
    }
}

func handleWriter(conn net.Conn) {
    scanner := bufio.NewScanner(os.Stdin)

    for scanner.Scan() {
        msg := scanner.Text()

        _, err := conn.Write([]byte(msg + "
"))
        if err != nil {
            log.Printf("Error sending message: %v
", err)
            conn.Close()
            break
        }
    }
}

在上述代码中,我们创建了一个TCP连接,并在不同的Goroutine中处理读取和发送消息。handleReader()函数从服务器端读取数据并输出到控制台,handleWriter()函数从输入读取数据并发送到服务器端。

结论:
使用Go语言和Goroutines构建高性能的并发推送服务非常简单。通过使用Goroutines处理每个连接,我们可以实现高并发的消息推送。同时,通过使用channelrrreee

Dans le code ci-dessus, nous créons un canal global message et utilisons Goroutine pour gérer la diffusion des messages. Nous utilisons également une carte clients pour stocker les clients connectés. Lorsqu'un nouveau message arrive, nous parcourons tous les clients et leur envoyons le message. 🎜🎜Étape 3 : Connexion client🎜🎜Maintenant que nous avons implémenté la logique push côté serveur, nous devons écrire le code client. Nous utilisons le package net du langage Go pour créer une connexion TCP et gérer les opérations de lecture et d'écriture dans différentes Goroutines. 🎜rrreee🎜Dans le code ci-dessus, nous créons une connexion TCP et gérons la lecture et l'envoi de messages dans différentes Goroutines. La fonction handleReader() lit les données du serveur et les envoie à la console, et la fonction handleWriter() lit les données de l'entrée et les envoie au serveur. 🎜🎜Conclusion : 🎜Il est très simple de créer un service push simultané hautes performances en utilisant le langage Go et Goroutines. En utilisant Goroutines pour gérer chaque connexion, nous pouvons obtenir une transmission de messages hautement simultanée. Dans le même temps, en utilisant channel pour transmettre des messages, nous pouvons implémenter la fonction de diffusion de messages. Grâce à cette approche, nous pouvons créer une application en temps réel hautes performances et à haute concurrence. 🎜

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