Heim  >  Artikel  >  Backend-Entwicklung  >  Führen Sie Consumer und API auf dem Golang-Port aus

Führen Sie Consumer und API auf dem Golang-Port aus

PHPz
PHPznach vorne
2024-02-09 12:30:19609Durchsuche

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

In diesem Artikel stellt der PHP-Editor Strawberry vor, wie man Verbraucher und APIs gleichzeitig auf dem Golang-Port ausführt. In modernen Anwendungen ist es oft notwendig, Verbraucher- und API-Anfragen gleichzeitig zu bearbeiten, um eine bessere Benutzererfahrung und Funktionalität zu bieten. Als effiziente Programmiersprache zeichnet sich Golang durch Parallelitätsleistung und geringes Gewicht aus und eignet sich sehr gut für die Erstellung solcher Anwendungen. Mithilfe der Anleitung in diesem Artikel erfahren Sie, wie Sie mit Golang Verbraucher und APIs schreiben und auf demselben Port ausführen und so die Anwendungsbereitstellung und -wartung vereinfachen. Lasst uns beginnen!

Frageninhalt

Ich habe ein Go-API-Projekt und betreibe auch einen Worker-Thread (rabbitmq). Ich habe gerade ein Problem entdeckt, bei dem meine Worker und mein http-Listener und -Dienst nicht zusammenarbeiten. Wenn ich den Worker ausführe, wird der API-Port nicht erreicht.

So sieht mein Code aus.

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

Das ist meins

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 nicht erreicht.

Ich verwende Gin-Gonic, um meine http-Anfragen zu bedienen.

Jede Hilfe willkommen.

Lösung

Ich bin bei der Verwendung des Gin-Frameworks auf ein ähnliches Problem gestoßen. Das Problem wurde gelöst, indem ich meinen Verbraucher in einer Go-Routine ausgeführt habe. Ich habe meinen Verbraucher wie folgt angerufen.

go notificationCallback.ConsumeBankTransaction()

Sowohl Server als auch Rabbitmq-Consumer laufen nahtlos. Überwachen Sie weiterhin die Leistung, um zu sehen, ob sie robust und belastbar genug ist.

Das obige ist der detaillierte Inhalt vonFühren Sie Consumer und API auf dem Golang-Port aus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen