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

PHPz
Freigeben: 2024-02-09 12:30:19
nach vorne
629 Leute haben es durchsucht

在 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
Nach dem Login kopieren
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)
}
Nach dem Login kopieren

Das ist meins

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

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()
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage