Maison > développement back-end > Golang > le corps du texte

Exécutez le consommateur et l'API sur le port Golang

PHPz
Libérer: 2024-02-09 12:30:19
avant
629 Les gens l'ont consulté

在 golang 端口上运行消费者和 api

l'éditeur php Strawberry présentera comment exécuter simultanément des consommateurs et des API sur le port Golang dans cet article. Dans les applications modernes, il est souvent nécessaire de traiter simultanément les demandes des consommateurs et des API pour offrir une meilleure expérience utilisateur et de meilleures fonctionnalités. En tant que langage de programmation efficace, Golang présente les caractéristiques de performances de concurrence et de légèreté, ce qui est très approprié pour créer de telles applications. Grâce aux conseils de cet article, vous apprendrez à utiliser Golang pour écrire des consommateurs et des API et les exécuter sur le même port, simplifiant ainsi le déploiement et la maintenance des applications. commençons!

Contenu de la question

J'ai un projet go api et je gère également un thread de travail (rabbitmq). Je viens de découvrir un problème où mes travailleurs, mon écouteur et mon service http ne travaillent pas ensemble. Lorsque j'exécute le travailleur, le port API n'est pas atteint.

Voici à quoi ressemble mon code.

app.go
Copier après la connexion
func (a *app) startworker() {

    connection, err := amqp091.dial(os.getenv("amqp_url"))
    if err != nil {
        panic(err)
    }
    defer connection.close()

    consumer, err := events.newconsumer(connection, database.getdatabase(a.database))
    if err != nil {
        panic(err)
    }
    consumer.listen(os.args[1:])

}

func (a *app) run(addr string) {
    logs := log.new(os.stdout, "my-service", log.lstdflags)

    server := &http.server{
        addr:         addr,
        handler:      a.router,
        errorlog:     logs,
        idletimeout:  120 * time.second, // max time for connections using tcp keep-alive
        readtimeout:  5 * time.second,
        writetimeout: 10 * time.second,
    }

    go func() {
        if err := server.listenandserve(); err != nil {
            logs.fatal(err)
        }
    }()

    // trap sigterm or interrupt and gracefully shutdown the server
    c := make(chan os.signal)
    signal.notify(c, os.interrupt)
    signal.notify(c, os.kill)

    sig := <-c
    logs.println("recieved terminate, graceful shutdown", sig)
    tc, _ := context.withtimeout(context.background(), 30*time.second)
    server.shutdown(tc)
}
Copier après la connexion

C'est à moi

consumer.go
Copier après la connexion
// newconsumer returns a new consumer
func newconsumer(conn *amqp.connection, db *mongo.database) (consumer, error) {
    consumer := consumer{
        conn: conn,
        db:   db,
    }
    err := consumer.setup()
    if err != nil {
        return consumer{}, err
    }

    return consumer, nil
}

// listen will listen for all new queue publications
// and print them to the console.
func (consumer *consumer) listen(topics []string) error {

    ch, err := consumer.conn.channel()
    if err != nil {
        return err
    }

    defer ch.close()

    if err != nil {
        return err
    }
    msgs, err := ch.consume("update.package.rating", "", true, false, false, false, nil)

    if err != nil {
        return err
    }

    forever := make(chan bool)
    go func() {
        for msg := range msgs {
            switch msg.routingkey {
            case "update.package.rating":
                worker.ratepackage(packagerepo.newpackagesrepository(consumer.db), msg.body)
            }
            // acknowledege received event
            log.printf("received a message: %s", msg.body)
        }
    }()

    log.printf("[*] waiting for message [exchange, queue][%s, %s]. to exit press ctrl+c", getexchangename(), "update.package.rating")
    <-forever
    return nil
}
Copier après la connexion
main.go
Copier après la connexion
func main() {
    start := app.App{}
    start.StartApp()
    start.StartWorker()
    start.Run(":3006")
}
Copier après la connexion

Port 3006 non atteint.

J'utilise gin-gonic pour répondre à mes requêtes http.

Toute aide est la bienvenue.

Solution

J'ai rencontré un problème similaire lors de l'utilisation du framework gin. J'ai résolu le problème en exécutant mon consommateur dans une routine Go. J'ai appelé mon consommateur comme ci-dessous.

go notificationCallback.ConsumeBankTransaction()
Copier après la connexion

Le serveur et le consommateur Rabbitmq fonctionnent de manière transparente. Surveillez toujours les performances pour voir si elles sont suffisamment robustes et résilientes.

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!

source:stackoverflow.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal