チームが現代のアプリケーションの要件を満たすために、より適応性、拡張性、機敏なソリューションを追求するにつれて、イベント駆動型アーキテクチャの採用が増加しています。イベント駆動型のアーキテクチャは、標準化され構造化されたイベントを介した通信を可能にすることで、リアルタイムの更新をサポートし、さまざまなシステム間の統合を合理化します。
前回のブログ投稿では、Auth0 の Webhook がどのようにイベントを送信し、これらのイベントを利用してロジックの実行を開始するかについて説明しました。この記事では、このアーキテクチャの技術的側面を詳しく掘り下げ、そのようなシステムを構築するために Go (Golang) をどのように利用できるかを示します。
まず、このシステムを駆動する主なコンポーネントを見てみましょう。
Auth0 には、テナント レベルのすべてのアクティビティに関連付けられたログ イベントがあります。これらのイベントは、監視または監査の目的で使用できます。各イベントのコードはここで確認できます
auth0 Webhook を使用して、フィルターされたイベントをプロデューサーに配信します。関心があるのはほんの一握りであるため、これらのイベントをフィルタリングします。
RabbitMQ は複数のメッセージング プロトコルをサポートしており、メッセージのルーティングに使用するプロトコルは Advanced Messaging Queuing Protocol (AMQP) です。 AMQP には、キュー、エクスチェンジ、バインディングという 3 つの主要なエンティティがあります。
Auth0 でイベントがトリガーされると、そのイベントは Webhook 経由でパブリッシャーに即座に送信され、パブリッシャーはイベント タイプに基づいてイベントをパブリッシュします。公開されると、イベントは交換に移ります。交換はメッセージを接続されたキューに送り、そこでコンシューマがメッセージを受信します。このプロセスを可能にするために、チャネルを確立します。このチャネルを使用すると、メッセージを公開して交換し、サブスクリプションのキューを宣言できます。
新しいキューを作成するには、チャネル上のパッケージによって提供される QueueDeclare 関数を利用し、必要なキューのプロパティを指定します。キューを作成したら、チャネルのパブリッシュ関数を使用してメッセージを送信できます。
次に、RabbitMQ に接続し、通信用のチャネルを確立するコンシューマーを作成します。このチャネルを使用すると、定義された Consume メソッドを使用してメッセージを消費できます。
ログイベントの処理には golang-auth0 管理パッケージを使用し、キューアクションには github.com/rabbitmq/amqp091-go を使用します。
以下にスニペットを示します:
ログの詳細な構造はここにあります
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 ----- }) } }
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 } } }
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 }
したがって、Auth0 の Webhook を活用してイベントをトリガーし、信頼性の高いメッセージのキューイングと配信に RabbitMQ を採用することで、スケーラブルで応答性の高いアプリケーションを構築できます。このアプローチにより、柔軟性が向上するだけでなく、シームレスなイベント処理もサポートされ、非同期操作の効率的な処理が可能になります。
この記事が役に立ち、イベント主導型の旅に有益であることが証明できれば幸いです。
コーディングを楽しんでください:)
以上がGolang の Log Event と RabbitMQ を使用したイベント駆動型の設計の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。