394
汽車大全
消息處理時長自適應__最佳實踐_消息服務-阿裏雲
背景描述
阿裏雲MNS消息服務的規範中,每條Message都有個默認的VisibilityTImeout,worker在接收到消息後,timeout就開始計時了。如果Worker在timeout時間內沒能處理完Message,那麼消息就有可能被其他Worker接收到並處理。
Timeout計時的好處是:消息處理完之後需要顯式地DeleteMessage,那麼如果Worker進程Crash等情況發生,這條Message還有機會被其他Worker處理。
一些用戶會將隊列的默認VIsibilityTimeout設置得比較長,以確保消息在被Worker處理完之前不會超時釋放。
問題
但是,在一些應用場景中,我們假設:
隊列的VisibilityTimeout是6個小時。
A worker接收到了Message M1,但是worker在處理完消息之後,進程發生了Crash或者機器發生了重啟。
那麼M1這條消息至少在6個小時之後才會被某個Worker接收到並處理。而自己寫代碼處理Failover的情況的話,程序又會變得比較複雜。
目標
在一些即時性要求比較高,並且又希望盡快響應每一條消息的場景下,我們會希望:
隊列的VisibilityTimeout比較短。比如是5分鍾,這樣的話,在發生了進程Crash之後,最多5分鍾,之前未處理完的消息就會被某個worker接收到並處理。
worker處理消息的過程中,耗時很有可能超過5分鍾,那麼消息在被處理的過程中,不能超時。
實現方案
對於這樣的場景,我們提供一個BestPractice的C# Demo:(請見附件)具體的做法是,在worker處理消息的過程中,為消息定期檢查是否需要做ChangeVisibility,worker處理完之後依然是主動deleteMessage。
如果有任何問題,歡迎大家在論壇發帖,或者直接加入我們的官方MNS技術支持旺旺群 (群號51222373)。
下麵是對於程序的幾點說明:
1. 運行前需要 填寫 accessId, accessKey, endPoint
2. 變量說明:
- MessageMinimalLife是消息注冊時必須有的最少的Life長度。需要這個的原因是,比如消息register的時候已經隻剩下0.1秒的超時時間了,那麼注冊進來也來不及ChangeVisibility延長生命。所以,MessageMinimalLife是為了確保Message能活到被ChangeVisibility,用戶可以自己根據業務壓力來設置。
- TimerInterval是Manager內部的Timer的Interval。隻需要確保在Message到達 MessageMinimalLife之前,Timer會被啟動就足夠了。時間可以設置得比較短(檢查得就比較頻繁)。
- QueueMessageVisibilityTimeout是Sample裏Message的默認超時時間,是Queue的屬性。Sample裏每次ChangeVisibility的時候,會把消息的VisibilityTimeout設置為QueueMessageVisibilityTimeout, 所以它的值需要大於 TimerInterval+ MessageMinimalLife,以確保消息不會超時。
- MessageTimeout是Message在Manager裏麵的超時時間,比如某個worker卡住了,消息在5個小時之後依然沒有處理完畢(假設5個小時遠遠超出消息的正常處理時間),那麼Manager就不會再為Message做ChangeVisibility了,會放任Message的Visibility超時。
3. 流程說明
Worker在ReceiveMessage之後,會先做RegisterMessage,然後處理Message,最後再調用Manager的deleteMessage。
Manager在消息第一次注冊進來之後,調用ThreadPool調度一個ChangeVisibilityTask檢查是否需要ChangeVisibility,並且把Message加到內部的messages列表中
Manager內部的Timer,會定時調用Parallel啟動 ChangeVisibilityTask檢查messages列表裏的所有message
“Manager.ChangeMessageVisibility (ChangeVisibilityTask)”相關的具體事情,在流程圖裏有顯示。流程圖如下:
示例代碼下載:ChangeMessageVisibilitySample
最後更新:2016-11-23 17:16:08
上一篇:
廣播拉取消息模型__最佳實踐_消息服務-阿裏雲
下一篇:
長輪詢__最佳實踐_消息服務-阿裏雲
在哪裏可以查到ECS的權限定義___雲服務器(ECS)授權問題_授權常見問題_訪問控製-阿裏雲
檢索數據__從 SQL 到 NoSQL_快速入門_表格存儲-阿裏雲
阿裏雲發布企業級產品家族,與跟隨者甩開身位!
阿裏雲爭搶萬億物聯網市場 亞馬遜、微軟“雲”業務或遭衝擊
更新媒體-刪除標簽__媒體接口_API使用手冊_視頻點播-阿裏雲
配置自動快照隨磁盤釋放__快照_用戶指南_雲服務器 ECS-阿裏雲
查詢query子句__搜索子句介紹_API參考手冊_開放搜索-阿裏雲
按量付費計費規則說明__ECS購買須知_產品使用問題_雲服務器 ECS-阿裏雲
錯誤編碼:HSF-0001__HSF 常見問題_開發常見問題_產品常見問題_企業級分布式應用服務 EDAS-阿裏雲
步驟一:控製台配置__快速上線_Web 應用防火牆-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲