Rumah > pembangunan bahagian belakang > Golang > Reka bentuk dipacu acara dengan Log Events dan RabbitMQ di Golang

Reka bentuk dipacu acara dengan Log Events dan RabbitMQ di Golang

WBOY
Lepaskan: 2024-07-23 11:30:32
asal
1075 orang telah melayarinya

Event-driven design with Log Events and RabbitMQ in Golang

Penggunaan seni bina dipacu acara semakin meningkat apabila pasukan mengejar penyelesaian yang lebih mudah disesuaikan, berskala dan tangkas untuk memenuhi keperluan aplikasi kontemporari. Seni bina dipacu acara menyokong kemas kini masa nyata dan menyelaraskan penyepaduan merentas sistem yang berbeza dengan mendayakan komunikasi melalui acara terstandard dan berstruktur.

Dalam catatan blog sebelum ini, saya membincangkan cara webhooks dalam Auth0 boleh menghantar acara, dengan itu memanfaatkan peristiwa ini untuk memulakan pelaksanaan logik. Dalam artikel ini, saya akan mendalami aspek teknikal seni bina ini dan menunjukkan cara Go (Golang) boleh digunakan untuk membina sistem sedemikian.

Komponen utama:

Mari kita lihat dahulu komponen utama yang memacu sistem ini.

Log Peristiwa:

Auth0 mempunyai peristiwa log yang dikaitkan dengan setiap aktiviti di peringkat penyewa. Peristiwa ini boleh digunakan untuk tujuan pemantauan atau audit. Kod untuk setiap acara boleh dilihat di sini

Webhooks:

Kami menggunakan auth0 webhooks untuk menyampaikan acara yang ditapis kepada penerbit kami. Kami menapis acara ini kerana kami hanya berminat dengan segelintir sahaja.

RabbitMQ

RabbitMQ menyokong berbilang protokol pemesejan, dan yang kami gunakan untuk menghalakan mesej ialah Protokol Gilir Pemesejan Lanjutan (AMQP). AMQP mempunyai tiga entiti utama – Baris Gilir, Pertukaran dan Pengikatan.

Di sebalik tabir

Apabila sesuatu acara dicetuskan dalam Auth0, ia akan dihantar dengan serta-merta melalui webhook kepada penerbit kami, yang kemudiannya menerbitkannya berdasarkan jenis acara. Setelah diterbitkan, acara itu pergi ke pertukaran. Pertukaran mengarahkan mesej ke baris gilir yang disambungkan, di mana pengguna menerimanya. Untuk mendayakan proses ini, kami mewujudkan saluran. Saluran ini membenarkan kami menerbitkan mesej untuk bertukar dan mengisytiharkan baris gilir untuk langganan.

Untuk membuat baris gilir baharu, kami menggunakan fungsi QueueDeclare yang disediakan oleh pakej pada saluran, menyatakan sifat baris gilir yang kami kehendaki. Dengan baris gilir yang dibuat, kami boleh menggunakan fungsi Terbitkan saluran untuk menghantar mesej.

Seterusnya, kami mencipta pengguna yang menyambung kepada RabbitMQ kami dan mewujudkan saluran untuk komunikasi. Menggunakan saluran ini, kami boleh menggunakan mesej menggunakan kaedah Gunakan yang ditakrifkan untuknya.

Kerja tanah

Kami menggunakan pakej pengurusan golang-auth0 untuk mengusahakan acara log dan untuk tindakan giliran kami menggunakan github.com/rabbitmq/amqp091-go.

Di bawah adalah coretan:

Penerbitan:

Struktur terperinci log boleh didapati di sini

    for _, auth0log := range payload.Logs {

        switch auth0log.Data.Type {
        case "slo":
            _, err = c.Publish(ctx, PublishRequest{
                ---your logic---
            })

        case "ss":
            _, err = c.Publish(ctx,PublishRequest{
                    -- your logic -----
                })

        }
    }
Salin selepas log masuk

Pertukaran:

    if consumeOptions.BindingExchange != "" {
        for _, routingKey := range routingKeys {
            err = consumer.chManager.channel.QueueBind(
                queue,
                routingKey,
                consumeOptions.BindingExchange,
                consumeOptions.BindingNoWait,
                tableToAMQPTable(consumeOptions.BindingArgs),
            )
            if err != nil {
                return err
            }
        }
    }
Salin selepas log masuk

Memakan:

func (c *Client) Consume() {
    err := c.consumer.StartConsuming(
        func(ctx context.Context, d queue.Delivery) bool {
            err := c.processMessages(ctx, d.Body, d.Exchange)
            if err != nil {
                c.log.Error().Ctx(ctx).Err(err).Str("exchange", d.Exchange).Msg("failed publishing")
                return nack // send to dlx
            }
            return ack // message acknowledged
        },
        c.queueName,
        []string{c.queueRoutingKey},
        func(opts *queue.ConsumeOptions) {
            opts.BindingExchange = c.queueBidingExchange
            opts.QueueDurable = true
            opts.QueueArgs = map[string]interface{}{
                "x-dead-letter-exchange": c.queueBidingExchangeDlx,
            }
        },
    )
    if err != nil {
        c.log.Fatal().Err(err).Msg("consumer: Failed to StartConsuming")
    }

    // block main thread so consumers run forever
    forever := make(chan struct{})
    <-forever
}   
Salin selepas log masuk

Oleh itu, dengan memanfaatkan webhook dalam Auth0 untuk mencetuskan acara dan menggunakan RabbitMQ untuk baris gilir dan penghantaran mesej yang boleh dipercayai, kami boleh membina aplikasi berskala dan responsif. Pendekatan ini bukan sahaja meningkatkan fleksibiliti tetapi juga menyokong pemprosesan acara yang lancar, membolehkan pengendalian operasi tak segerak yang cekap.

Saya harap artikel ini dapat membantu dan terbukti bermanfaat dalam perjalanan anda yang didorong oleh acara.

Selamat mengekod :)

Atas ialah kandungan terperinci Reka bentuk dipacu acara dengan Log Events dan RabbitMQ di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan