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!
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.
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!