首頁 > 後端開發 > Golang > 主體

在 golang 連接埠上運行消費者和 api

PHPz
發布: 2024-02-09 12:30:19
轉載
629 人瀏覽過

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

php小編草莓在這篇文章中將介紹如何在Golang連接埠上同時運行消費者和API。在現代應用程式中,往往需要同時處理消費者和API請求,以提供更好的使用者體驗和功能。 Golang作為一種高效的程式語言,具有並發效能和輕量級的特點,非常適合用於建立這樣的應用程式。透過本文的指導,您將學習如何使用Golang編寫消費者和API,並在同一個連接埠上運行它們,從而簡化應用程式的部署和維護。讓我們開始吧!

問題內容

我有一個 go api 項目,我還執行一個工作執行緒 (rabbitmq)。我剛剛發現一個問題,我的工作人員和我的 http 監聽和服務不能一起工作。當我運行worker時,api端口未到達。

這是我的程式碼的樣子。

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)
}
登入後複製

這是我的

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")
}
登入後複製

未到達連接埠 3006。

我正在使用 gin-gonic 來服務我的 http 請求。

歡迎任何幫助。

解決方法

我在使用 gin 框架時遇到了類似的問題。透過在 go 例程中運行我的消費者解決了這個問題。我像下面一樣調用了我的消費者。

go notificationCallback.ConsumeBankTransaction()
登入後複製

伺服器和rabbitmq消費者都無縫運作。仍然監視性能,看看它是否足夠健壯和有彈性。

以上是在 golang 連接埠上運行消費者和 api的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板