Home > Article > Backend Development > Run consumer and api on golang port
#php editor Strawberry will introduce how to run consumers and APIs on the Golang port at the same time in this article. In modern applications, it is often necessary to handle consumer and API requests simultaneously to provide better user experience and functionality. As an efficient programming language, Golang has the characteristics of concurrency performance and lightweight, which is very suitable for building such applications. Through the guidance of this article, you will learn how to use Golang to write consumers and APIs and run them on the same port, thus simplifying application deployment and maintenance. let's start!
I have a go api project and I also run a worker thread (rabbitmq). I just discovered an issue where my workers and my http listener and service don't work together. When I run the worker, the api port is not reached.
This is what my code looks like.
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) }
this is mine
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 not reached.
I'm using gin-gonic to serve my http requests.
Any help welcome.
I encountered a similar problem when using the gin framework. Solved the problem by running my consumer in a go routine. I called my consumer like below.
go notificationCallback.ConsumeBankTransaction()
Both the server and rabbitmq consumer run seamlessly. Still monitor performance to see if it's robust and resilient enough.
The above is the detailed content of Run consumer and api on golang port. For more information, please follow other related articles on the PHP Chinese website!