Home  >  Article  >  Backend Development  >  Run consumer and api on golang port

Run consumer and api on golang port

PHPz
PHPzforward
2024-02-09 12:30:19609browse

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

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

Question content

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.

Solution

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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete