介紹
在建構分散式系統時,像 Amazon SQS 這樣的訊息佇列在處理非同步工作負載方面發揮著至關重要的作用。在這篇文章中,我將分享我在 Go 中實現強大的 SQS 消費者的經驗,該消費者可以處理 Keycloak 的用戶註冊事件。此解決方案使用扇出/扇入並發模式來有效處理訊息,而不會佔用系統資源。
挑戰
我遇到了一個有趣的問題:每天處理大約 50,000 個 SQS 事件以在 Keycloak 中註冊用戶。一種幼稚的方法可能會為每個訊息產生一個新的 goroutine,但這可能很快就會導致資源耗盡。我們需要一種更受控制的並發方法。
為什麼要扇出/扇入?
扇出/扇入模式非常適合此用例,因為它:
- 維護固定的工作協程池
- 在工人之間均勻分配工作
- 防止資源耗盡
- 提供對並發操作的更好控制
實施深入探討
1. 消費者結構
首先我們來看看我們的基本消費結構:
type Consumer struct { Client *sqs.Client QueueName string }
2. 訊息處理管道
實現由三個主要組件組成:
- 訊息接收者:不斷輪詢SQS以取得新訊息
- 工作池:處理訊息的 goroutine 數量固定
- 訊息通道:將接收者連接到工作人員
這是我們啟動消費者的方式:
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 }
最佳實踐和學習
- 錯誤處理:始終優雅地處理錯誤並適當記錄它們
- 訊息清理:僅在成功處理後刪除訊息
- 優雅關機:使用上下文實現正確的關閉機制
- 監控:在關鍵點新增日誌記錄以提高可觀察性
性能考慮因素
- 工作人員數量:根據您的工作負載和可用資源進行選擇
- 批次大小:吞吐量和處理時間之間的平衡
- 可見性超時:依照您的平均處理時間設定
未來的改進
- 動態工作人員擴充:依佇列深度調整工作人員數量
- 斷路器:為下游服務增加斷路器
- Metrics Collection:新增 Prometheus 指標進行監控
- 死信佇列:對失敗訊息實施DLQ處理
- 重試:為瞬時失敗增加指數退避
結論
扇出/扇入模式為在 Go 中處理大量 SQS 訊息提供了一個優雅的解決方案。透過維護固定的工作池,我們可以避免無限制的 goroutine 創建的陷阱,同時確保高效的訊息處理。
請記住在實現此類模式時始終考慮您的特定用例。此處顯示的配置值(工作執行緒數、逾時值等)應根據您的要求和資源限制進行調整。
原始碼:[連結到您的儲存庫(如果有)]
標籤:#golang #aws #sqs #concurrency #distributed-systems
以上是用 Go 建構可擴展的 SQS 消費者的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

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

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

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

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

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

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

goinitializespackagesintheordertheordertheyimported,thenexecutesInitFunctionswithinApcageIntheirdeFinityOrder,andfilenamesdetermineTheOrderAcractacractacrosmultiplefiles.thisprocessCanbeCanbeinepessCanbeInfleccessByendercrededBydeccredByDependenciesbetenciesbetencemendencenciesbetnependendpackages,whermayleLeadtocomplexinitialitialializizesizization


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

禪工作室 13.0.1
強大的PHP整合開發環境

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

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

WebStorm Mac版
好用的JavaScript開發工具