搜尋
首頁後端開發Golang用 Go 建構可擴展的 SQS 消費者

Building a Scalable SQS Consumer in Go

介紹

在建構分散式系統時,像 Amazon SQS 這樣的訊息佇列在處理非同步工作負載方面發揮著至關重要的作用。在這篇文章中,我將分享我在 Go 中實現強大的 SQS 消費者的經驗,該消費者可以處理 Keycloak 的用戶註冊事件。此解決方案使用扇出/扇入並發模式來有效處理訊息,而不會佔用系統資源。

挑戰

我遇到了一個有趣的問題:每天處理大約 50,000 個 SQS 事件以在 Keycloak 中註冊用戶。一種幼稚的方法可能會為每個訊息產生一個新的 goroutine,但這可能很快就會導致資源耗盡。我們需要一種更受控制的並發方法。

為什麼要扇出/扇入?

扇出/扇入模式非常適合此用例,因為它:

  • 維護固定的工作協程池
  • 在工人之間均勻分配工作
  • 防止資源耗盡
  • 提供對並發操作的更好控制

實施深入探討

1. 消費者結構

首先我們來看看我們的基本消費結構:

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

2. 訊息處理管道

實現由三個主要組件組成:

  1. 訊息接收者:不斷輪詢SQS以取得新訊息
  2. 工作池:處理訊息的 goroutine 數量固定
  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. Metrics Collection:新增 Prometheus 指標進行監控
  4. 死信佇列:對失敗訊息實施DLQ處理
  5. 重試:為瞬時失敗增加指數退避

結論

扇出/扇入模式為在 Go 中處理大量 SQS 訊息提供了一個優雅的解決方案。透過維護固定的工作池,我們可以避免無限制的 goroutine 創建的陷阱,同時確保高效的訊息處理。

請記住在實現此類模式時始終考慮您的特定用例。此處顯示的配置值(工作執行緒數、逾時值等)應根據您的要求和資源限制進行調整。


原始碼:[連結到您的儲存庫(如果有)]

標籤:#golang #aws #sqs #concurrency #distributed-systems

以上是用 Go 建構可擴展的 SQS 消費者的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
初始功能和副作用:平衡初始化與可維護性初始功能和副作用:平衡初始化與可維護性Apr 26, 2025 am 12:23 AM

Toensureinitfunctionsareeffectiveandmaintainable:1)Minimizesideeffectsbyreturningvaluesinsteadofmodifyingglobalstate,2)Ensureidempotencytohandlemultiplecallssafely,and3)Breakdowncomplexinitializationintosmaller,focusedfunctionstoenhancemodularityandm

開始GO:初學者指南開始GO:初學者指南Apr 26, 2025 am 12:21 AM

goisidealforbeginnersandsubableforforcloudnetworkservicesduetoitssimplicity,效率和concurrencyFeatures.1)installgromtheofficialwebsitealwebsiteandverifywith'.2)

進行並發模式:開發人員的最佳實踐進行並發模式:開發人員的最佳實踐Apr 26, 2025 am 12:20 AM

開發者應遵循以下最佳實踐:1.謹慎管理goroutines以防止資源洩漏;2.使用通道進行同步,但避免過度使用;3.在並發程序中顯式處理錯誤;4.了解GOMAXPROCS以優化性能。這些實踐對於高效和穩健的軟件開發至關重要,因為它們確保了資源的有效管理、同步的正確實現、錯誤的適當處理以及性能的優化,從而提升軟件的效率和可維護性。

進行生產:現實世界的用例和示例進行生產:現實世界的用例和示例Apr 26, 2025 am 12:18 AM

Goexcelsinproductionduetoitsperformanceandsimplicity,butrequirescarefulmanagementofscalability,errorhandling,andresources.1)DockerusesGoforefficientcontainermanagementthroughgoroutines.2)UberscalesmicroserviceswithGo,facingchallengesinservicemanageme

go中的自定義錯誤類型:提供詳細的錯誤信息go中的自定義錯誤類型:提供詳細的錯誤信息Apr 26, 2025 am 12:09 AM

我們需要自定義錯誤類型,因為標準錯誤接口提供的信息有限,自定義類型能添加更多上下文和結構化信息。 1)自定義錯誤類型能包含錯誤代碼、位置、上下文數據等,2)提高調試效率和用戶體驗,3)但需注意其複雜性和維護成本。

使用GO編程語言構建可擴展系統使用GO編程語言構建可擴展系統Apr 25, 2025 am 12:19 AM

goisidealforbuildingscalablesystemsduetoitssimplicity,效率和建築物內currencysupport.1)go'scleansyntaxandaxandaxandaxandMinimalisticDesignenhanceProductivityAndRedCoductivityAndRedCuceErr.2)ItSgoroutinesAndInesAndInesAndInesAndineSandChannelsEnablenableNablenableNableNablenableFifficConcurrentscorncurrentprogragrammentworking torkermenticmminging

有效地使用Init功能的最佳實踐有效地使用Init功能的最佳實踐Apr 25, 2025 am 12:18 AM

Initfunctionsingorunautomationbeforemain()andareusefulforsettingupenvorments和InitializingVariables.usethemforsimpletasks,避免使用輔助效果,andbecautiouswithTestingTestingTestingAndLoggingTomaintAnainCodeCodeCodeClarityAndTestesto。

INIT函數在GO軟件包中的執行順序INIT函數在GO軟件包中的執行順序Apr 25, 2025 am 12:14 AM

goinitializespackagesintheordertheordertheyimported,thenexecutesInitFunctionswithinApcageIntheirdeFinityOrder,andfilenamesdetermineTheOrderAcractacractacrosmultiplefiles.thisprocessCanbeCanbeinepessCanbeInfleccessByendercrededBydeccredByDependenciesbetenciesbetencemendencenciesbetnependendpackages,whermayleLeadtocomplexinitialitialializizesizization

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具