阿里云國際站經(jīng)銷商,主營阿里云,騰訊云,華為云,亞馬遜aws,谷歌云gcp,微軟云az,免費(fèi)開戶,代充值優(yōu)惠大,聯(lián)系客服飛機(jī)@jkkddd


消息處理時(shí)長自適應(yīng)

本文介紹如何使消息處理時(shí)長自適應(yīng)。
背景信息
消息服務(wù)MNS的規(guī)范中,每條消息都有個(gè)默認(rèn)的VisibilityTimeout,Worker在接收到消息后,Timeout就開始計(jì)時(shí)了。 如果Worker在Timeout時(shí)間內(nèi)沒能處理完消息,那么消息就有可能被其他Worker接收到并處理。
Timeout計(jì)時(shí)的好處在于消息處理完之后需要顯式地DeleteMessage,那么如果Worker進(jìn)程停止等情況發(fā)生,這條消息還有機(jī)會被其他Worker處理。
一些用戶會將隊(duì)列的默認(rèn)VisibilityTimeout設(shè)置得比較長,以確保消息在被Worker處理完之前不會超時(shí)釋放。
問題描述
隊(duì)列的VisibilityTimeout是6個(gè)小時(shí)。
一個(gè)Worker接收到了消息M1,但是Worker在處理完消息之后,進(jìn)程發(fā)生了Crash或者機(jī)器發(fā)生了重啟。
那么M1這條消息至少在6個(gè)小時(shí)之后才會被另一個(gè)Worker接收到并處理。而自己寫代碼處理Failover的情況的話,程序又會變得比較復(fù)雜。
目標(biāo)
在一些即時(shí)性要求比較高,并且又希望盡快響應(yīng)每一條消息的場景下,用戶會希望:
隊(duì)列的VisibilityTimeout比較短,例如5分鐘。在發(fā)生了進(jìn)程Crash后,最多5分鐘,未處理完的消息就會被某個(gè)Worker接收到并處理。
Worker處理消息的過程中,耗時(shí)很有可能超過5分鐘,那么消息在被處理的過程中不能超時(shí)。
解決方案
BestPractice的C# Demo可以實(shí)現(xiàn)這樣的場景。Demo下載地址為Sample。具體的做法是,在Worker處理消息的過程中,為消息定期檢查是否需要做ChangeVisibility,Worker處理完之后依然是主動(dòng)deleteMessage。
遇到Demo使用問題,可提交工單處理。
下面是對于程序的幾點(diǎn)說明:
運(yùn)行前需要填寫accessId、accessKey、EndPoint。
變量說明:
MessageMinimalLife是消息注冊時(shí)必須有的最少的Life長度。需要這個(gè)的原因是,例如消息register的時(shí)候已經(jīng)只剩下0.1秒的超時(shí)時(shí)間了,注冊進(jìn)來也來不及ChangeVisibility延長生命。所以,MessageMinimalLife是為了確保消息能活到被ChangeVisibility,用戶可以自己根據(jù)業(yè)務(wù)壓力來設(shè)置。
TimerInterval是Manager內(nèi)部的Timer的Interval。只需要確保在Message到達(dá)MessageMinimalLife之前,Timer會被啟動(dòng)就足夠了。時(shí)間可以設(shè)置得比較短(檢查得就比較頻繁)。
QueueMessageVisibilityTimeout是Sample里Message的默認(rèn)超時(shí)時(shí)間,是Queue的屬性。Sample里每次ChangeVisibility的時(shí)候,會把消息的VisibilityTimeout設(shè)置為QueueMessageVisibilityTimeout,所以它的值需要大于TimerInterval+ MessageMinimalLife,以確保消息不會超時(shí)。
MessageTimeout是Message在Manager里面的超時(shí)時(shí)間,例如某個(gè)Worker卡住了,消息在5個(gè)小時(shí)之后依然沒有處理完畢(假設(shè)5個(gè)小時(shí)遠(yuǎn)遠(yuǎn)超出消息的正常處理時(shí)間),那么Manager就不會再為消息做ChangeVisibility了,會放任消息的Visibility超時(shí)。
流程說明:
Worker在ReceiveMessage之后,會先做RegisterMessage,然后處理Message,最后再調(diào)用Manager的deleteMessage。
Manager在消息第一次注冊進(jìn)來之后,調(diào)用ThreadPool調(diào)度一個(gè)ChangeVisibilityTask檢查是否需要ChangeVisibility,并且把Message加到內(nèi)部的messages列表中。
Manager內(nèi)部的Timer,會定時(shí)調(diào)用Parallel啟動(dòng) ChangeVisibilityTask檢查messages列表里的所有message。

Manager.ChangeMessageVisibility (ChangeVisibilityTask)相關(guān)的具體事情,在流程圖里有顯示


心靈雞湯:

標(biāo)題:阿里云賬號注冊,阿里云國際代理商

地址:http://www.nickbaillie.com/kfxw/64305.html