検索
ホームページバックエンド開発GolangGo でスケーラブルな SQS コンシューマを構築する

Building a Scalable SQS Consumer in Go

導入

分散システムを構築する場合、Amazon SQS などのメッセージキューは非同期ワークロードの処理において重要な役割を果たします。この投稿では、Keycloak のユーザー登録イベントを処理する堅牢な SQS コンシューマーを Go に実装した私の経験を共有します。このソリューションは、ファンアウト/ファンイン同時実行パターンを使用して、システム リソースを圧迫することなくメッセージを効率的に処理します。

挑戦

私は興味深い問題に直面しました。それは、Keycloak にユーザーを登録するために毎日約 50,000 の SQS イベントを処理することです。単純なアプローチでは、メッセージごとに新しい goroutine が生成される可能性がありますが、これはすぐにリソースの枯渇につながる可能性があります。同時実行に対して、より制御されたアプローチが必要でした。

なぜファンアウト/ファンインなのか?

ファンアウト/ファンイン パターンは、次の理由からこのユースケースに最適です。

  • ワーカーゴルーチンの固定プールを維持します
  • 従業員間で作業を均等に分配します
  • リソースの枯渇を防止します
  • 同時操作をより適切に制御できます

実装の詳細

1. 消費者の構造

まず、基本的な消費者の構造を見てみましょう:

type Consumer struct {
    Client    *sqs.Client
    QueueName string
}

2. メッセージ処理パイプライン

実装は 3 つの主要コンポーネントで構成されます:

  1. メッセージ受信者: 新しいメッセージについて SQS を継続的にポーリングします
  2. ワーカープール: メッセージを処理するゴルーチンの固定数
  3. メッセージ チャネル: 受信者をワーカーに接続します

コンシューマを開始する方法は次のとおりです:

func StartPool[requestBody any](
    serviceFunc func(c context.Context, dto *requestBody) error,
    consumer *Consumer) {

    ctx := context.Background()
    params := &sqs.ReceiveMessageInput{
        MaxNumberOfMessages: 10,
        QueueUrl:           aws.String(consumer.QueueName),
        WaitTimeSeconds:    20,
        VisibilityTimeout:  30,
        MessageAttributeNames: []string{
            string(types.QueueAttributeNameAll),
        },
    }

    msgCh := make(chan types.Message)
    var wg sync.WaitGroup

    // Start worker pool first
    startPool(ctx, msgCh, &wg, consumer, serviceFunc)

    // Then start receiving messages
    // ... rest of the implementation
}

3. 主要な設定パラメータ

重要な SQS 構成パラメータを調べてみましょう:

  • MaxNumberOfMessages (10): 各ポーリングのバッチ サイズ
  • WaitTimeSeconds (20): 長いポーリング期間
  • VisibilityTimeout (30): メッセージ処理の猶予期間

4. ワーカープールの実装

ワーカー プールは、ファンアウト パターンが作用する場所です。

func startPool[requestBody any](
    ctx context.Context,
    msgCh chan types.Message,
    wg *sync.WaitGroup,
    consumer *Consumer,
    serviceFunc func(c context.Context, dto *requestBody) error) {

    processingMessages := &sync.Map{}

    // Start 10 workers
    for i := 0; i 



<h3>
  
  
  5. 重複メッセージの処理
</h3>

<p>重複メッセージの処理を防ぐために sync.Map を使用します。<br>
</p><pre class="brush:php;toolbar:false">type Consumer struct {
    Client    *sqs.Client
    QueueName string
}

ベストプラクティスと学習

  1. エラー処理: 常にエラーを適切に処理し、適切にログに記録します
  2. メッセージのクリーンアップ: 処理が成功した場合にのみメッセージを削除します
  3. 正常なシャットダウン: コンテキストを使用して適切なシャットダウン メカニズムを実装します
  4. モニタリング: 可観測性のために重要なポイントにログを追加します

パフォーマンスに関する考慮事項

  • ワーカー数: ワークロードと利用可能なリソースに基づいて選択します
  • バッチサイズ: スループットと処理時間のバランス
  • 可視性タイムアウト: 平均処理時間に応じて設定します

今後の改善点

  1. 動的ワーカー スケーリング: キューの深さに基づいてワーカー数を調整します
  2. サーキット ブレーカー: ダウンストリーム サービス用のサーキット ブレーカーを追加します
  3. メトリクス コレクション: モニタリング用の Prometheus メトリクスを追加します
  4. デッドレターキュー: 失敗したメッセージに対する DLQ 処理を実装します
  5. 再試行: 一時的な障害に対して指数バックオフを追加します

結論

ファンアウト/ファンイン パターンは、Go で大量の SQS メッセージを処理するための洗練されたソリューションを提供します。固定ワーカー プールを維持することで、効率的なメッセージ処理を確保しながら、無制限の goroutine 作成の落とし穴を回避します。

このようなパターンを実装するときは、常に特定のユースケースを考慮することを忘れないでください。ここに表示される構成値 (ワーカー数、タイムアウト値など) は、要件とリソースの制約に基づいて調整する必要があります。


ソースコード: [利用可能な場合はリポジトリへのリンク]

タグ: #golang #aws #sqs #concurrency #distributed-systems

以上がGo でスケーラブルな SQS コンシューマを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
GOのインターフェイスと多型:コードの再利用性の達成GOのインターフェイスと多型:コードの再利用性の達成Apr 29, 2025 am 12:31 AM

インターフェースアンドポリマスを導入することは、codeReusablivedainability.1)defineinterfacesattherightabstractionlevel.2)useinterfacesfordependencyinjection.3)profilecodetAnageperformanceImpacts。

GOの「init」関数の役割は何ですか?GOの「init」関数の役割は何ですか?Apr 29, 2025 am 12:28 AM

initistingorunsoutomativiviseativeatializepackages andsetuptheenvironment.it'susefulforstingupglobalvariables、resources、およびperformingone-tastasksacrossanypackage.hoer'showitworks:1)Itcanbeusedinpackage、not not-justhe、

GOのインターフェイス構成:複雑な抽象化を構築しますGOのインターフェイス構成:複雑な抽象化を構築しますApr 29, 2025 am 12:24 AM

インターフェイスの組み合わせは、関数を小さな焦点を絞ったインターフェイスに分解することにより、GOプログラミングで複雑な抽象化を構築します。 1)リーダー、ライター、およびより近いインターフェイスを定義します。 2)これらのインターフェイスを組み合わせて、ファイルやネットワークストリームなどの複雑なタイプを作成します。 3)ProcessData関数を使用して、これらの組み合わせインターフェイスを処理する方法を示します。このアプローチはコードの柔軟性、テスト可能性、再利用性を高めますが、過度の断片化と組み合わせの複雑さを避けるために注意する必要があります。

goでinit機能を使用する場合の潜在的な落とし穴と考慮事項goでinit機能を使用する場合の潜在的な落とし穴と考慮事項Apr 29, 2025 am 12:02 AM

intionsingoareautomativitiveedemain foreThemain foreThemaindareusefurfurforseTup butChallenges.1)実行命令:rundistionsrunindediontionOrder.2)テスト:テスト:in functionsMayInterwithests、b

GOの地図をどのように反復しますか?GOの地図をどのように反復しますか?Apr 28, 2025 pm 05:15 PM

記事では、GOのマップを介して反復し、安全なプラクティスに焦点を当て、エントリを変更し、大規模なマップのパフォーマンスに関する考慮事項に焦点を当てています。

GOでどのようにマップを作成しますか?GOでどのようにマップを作成しますか?Apr 28, 2025 pm 05:14 PM

この記事では、初期化方法や要素の追加/更新など、GOのマップの作成と操作について説明します。

ArrayとGoのスライスの違いは何ですか?ArrayとGoのスライスの違いは何ですか?Apr 28, 2025 pm 05:13 PM

この記事では、GOの配列とスライスの違いについて説明し、サイズ、メモリの割り当て、機能の合格、および使用シナリオに焦点を当てています。アレイは固定サイズで、スタックに挿入されていますが、スライスは動的で、しばしばヒープアロークされ、より柔軟です。

GOでどのようにスライスを作成しますか?GOでどのようにスライスを作成しますか?Apr 28, 2025 pm 05:12 PM

この記事では、リテラル、メイク機能、既存のアレイまたはスライスのスライスなど、GOのスライスの作成と初期化について説明します。また、スライスの構文とスライスの長さと容量の決定もカバーします。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン