Maison  >  Article  >  développement back-end  >  Exécutez le consommateur et l'API sur le port Golang

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

PHPz
PHPzavant
2024-02-09 12:30:19605parcourir

在 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
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)
}

C'est à moi

consumer.go
// 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
}
main.go
func main() {
    start := app.App{}
    start.StartApp()
    start.StartWorker()
    start.Run(":3006")
}

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()

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer