您的位置

奥运足球直播时间表:打造更適合IoT場景的消息隊列實踐

來源:2012奥运会足球直播表 點擊:755

2012奥运会足球直播表 www.ubmml.com.cn 簡介:隨著我接觸越來越多的顧客,我對“傳統隊列”的看法.)也越來越被推翻。當然,這篇文章并不是說“傳統隊列”沒有做好。經過多年的完善,這些隊列系統在高性能、海量積累、消息可靠性等方面都做得非常好,并且做得非常好。但是今天,我認為每個人在設計一個方案時總是選擇隊列,比如異步和系統解耦,然后經?;岢魷衷諳呶侍?。在這些問題的背后,我們必須看到什么樣的場景是合適的,在過渡中使用什么樣的場景,以及是否有更好的解決方案。尤其是今天,物聯網領域有著復雜的場景。它有自己的SAAS服務和多租戶PAAS平臺模式,并面臨更多的排隊問題。讓我們一起討論和分享。

作者:陸,阿里云智能物聯網事業部高級技術專家。

隨著接觸越來越多的顧客,我對“傳統排隊”的看法.)也越來越被顛覆。當然,這篇文章并不是說“傳統隊列”沒有做好。經過多年的完善,這些隊列系統在高性能、海量積累、消息可靠性等方面都做得非常好,并且做得非常好。但是今天,我認為每個人在設計一個方案時總是選擇隊列,比如異步和系統解耦,然后經?;岢魷衷諳呶侍?。在這些問題的背后,我們必須看到什么樣的場景是合適的,在過渡中使用什么樣的場景,以及是否有更好的解決方案。尤其是今天,物聯網領域有著復雜的場景。它有自己的SAAS服務和多租戶PAAS平臺模式,并面臨更多的排隊問題。讓我們一起討論和分享。

本文討論的產品:阿里云物聯網平臺

IoT使用隊列場景

image.png

Queue是IoT領域中一個極其重要的組件。每月向服務器發送消息的嵌入式芯片需要傳遞事件消息。例如,共享充電寶的機柜打開、服務器向設備發送開機指令、工業網關的高頻消息流等。隊列的最大意義是使整個消息事件在不可控的環境因素下成為一個穩定的運行系統。例如,網絡上的設備會不時抖動。一些設備故障和一些震動會導致大量信息激增。

我們將隊列用于兩種情況,一種是上行,另一種是下行。我們在隊列網關上復用了kafka和rocketmq,并添加了一個自己開發?氖凳倍恿?,以盡最大努力使實時服務相對可用,即使隊列堆積的范圍很大。例如,充電寶,即使大量用戶的隊列消息累積,新用戶來控制它們,它也可以打開柜子,即使有大量的累積,也能快速恢復業務,而不是要求操作和維護學生清理累積,以快速使業務可用。當大量堆積時,僅僅使用卡夫卡或火箭智商很可能是一個可怕的失敗?

設備上行消息,總qp非常高,通常需要收集到一組消費者。這個場景適合選擇市場上的隊列類型卡夫卡和mq。然而,物聯網控制設備場景需要高實時性能。在堆疊過程中直接使用卡夫卡和其他與此隊列相關的入口設備會對業務產生影響,這不是最佳方式。

設備的下行報文,總qps不高,通常由打開下行控制設備機柜等觸發。這種情況要求高到達率和高設備級隔離要求。不允許由于一個設備消息的擁塞而干擾對其他設備的控制。這種情況更適合于即時消息,如釘住消息,這也是我們自己開發的物聯網設備級隊列。

我們做了什么優化

1。上行鏈路和下行鏈路分離

下行鏈路尤為重要。例如,控制一個設備,如開鎖、付款成功時打開櫥柜等。上行鏈路中的任何問題不得影響下行鏈路服務。

2。物聯網隊列-設備級別/批量主題

下行推送設備消息隊列。

image.png

圖1和圖2很明顯。一個隊列中的擁塞將最小化對其他設備的影響。

3。物聯網隊列-服務器訂閱

用于向用戶服務器發送用戶設備消息的隊列。它相當于隊列網關。我們c

每個人都非常使用它,并且非常了解它。排隊基本上是設計分布式系統的一個必要組成部分??贍芑嵊懈嗟某【?,而不是更多。

你對線上的累積有什么反應?

如果沒有積累,隊列將毫無意義。

大多數使用隊列的系統可能經歷過“堆積”情況。如果你沒有遇到積累,這意味著你很幸運。你的生產和消費是相對穩定的,你沒有遭受異常的抖動。然而,你仍然需要考慮你的計劃是什么,它對在線系統的穩定性有什么影響。

我們自己和用戶都面臨“積累”的情況。我們已經在物聯網中使用具有W級主題數的RocketMQ(Ali中的元)將消息從用戶設備傳輸到用戶自己購買的隊列中。

暫時抖動這種積累通常是自我消化的。奇怪的現象是大部分場景都堆積起來了。例如,有幾十個鎢棒堆?諞黃?。用戶的第一反應是什么?

許多結論是:積累幾乎是一個在線故障,需要首先清除積累!

積累能力強是好事嗎?

1。為什么你需要清理積累?

a .假設IoT“實時讓隊列變得出乎意料”:

示例:快遞柜服務的隊列堆積如山,然后柜旁的用戶“此時”正在拼命用手機敲擊柜子。它不能被打開(后端系統被恢復),但是他仍然不能打開它。問題是隊列中有幾十個w消息。抱歉有新消息,我們必須排隊。在等待持續消費的消息之前,不知道這個消息是否有用。然后這個“此時此刻”的人又厭惡地走開了,來到了下一個“此時此刻”。因此,操作和維護人員必須手動清除大量累積的消息,以便在設備旁等待的人可以記錄他的快遞。

b .即使不是物聯網領域,我相信一定有一些學生在網上遇到過清算存款和重置消費點的情況,這種情況可能會發生:業務雪崩、業務更快恢復

丟失一些數據或交易更快恢復哪一點更重要.等一會兒,不行,客戶已經投訴了,壓力很大,讓我們先清理存款,然后再補充一個設計數據一致性方案。

在休息時間之前,卡夫卡遇到了用戶的反饋。KAFKA在消費者端堆疊時有很高的寫入延遲。最后,我們發現,由于需要從硬盤加載冷數據來堆疊消息數據,io達到了高水平。

2。有多少情況你不需要清理積累?

a .瞬時抖動和自恢復(其中大部分可以在幾分鐘內消耗掉可能不成問題)-這種情況確實是相對大量的

b .時間不重要的數據,如日志。因此,“網上積累需要先清理”是一把雙刃劍。沒有積累不是排隊,積累過多會影響你的生意。不能擁抱過渡的積累。

有什么方法可以優化它嗎?

首先總結問題

1。只要消費者有足夠的消費能力,市場上的所有隊列都承諾實時信息。

有些學生還說將實時消息主題與其他主題分開并給予優先權是不夠的?對不起,這是題外話,繼續看上面的例子。

2。物聯網是一個PAAS平臺,在內部我可以要求其他團隊增加他們的消費能力。外部獨立軟件供應商用戶和客戶擁有最終發言權。每個開發人員都很難遵循您想要優化的方法。

雖然我們也可以做很多租戶隔離措施,甚至告訴用戶你自己的隊列問題是你的業務處理能力不足或者你直接有問題。然而,用戶仍然感到委屈。他必須為商業問題承擔責任。

3。隊列的存儲和內核機制幾乎都是先進先出的(即先進先出,后面的必須等前面的出來)

3.1只有這樣隊列才能有序,要么分區有序,要么全局有序。

3.2在積累的情況下,新消息必須在被消費之前積累。這種情況肯定會導致后續消息的被動延遲。

3.3請注意,有些隊列說無序消息只是發送者是同步的還是異步的無序,每個子消費隊列單元的底層仍然在這種結構中運行。如果業務對象中有新的傳入消息

在某些場景中,秩序維護非常重要。然而,我認為一定有不需要順序保存的場景,或者時間戳的設計而不是依賴消息序列也可以解決許多場景問題。這兩種情況加在一起,至少可以滿足我們目前所知的80%的業務。

補充說,一個真實系統中的業務流程通常有許多鏈接,它必須經過ABCD多系統隊列0E/F/G隊列1XYZ。這個完整的鏈接是一個完整的商業交易。在隊列0中進行訂購是不夠的。要使整個從A到Z有條不紊,成本是非常高的。這不僅是一個可以通過有序排隊解決的問題。

為了維持秩序,隊列產品要花很多錢,就像上面提到的活生生的例子,卡夫卡在堆疊過程中突然在消費端恢復,這使得卡夫卡需要加載硬盤冷數據來使io崩潰,這可以有效地直接發送成功生成的數據,但是由于堆疊必須首先加載硬盤數據,所以新輸入的數據沒有機會。

即使當前的隊列產品有無序的隊列類型,每個消費隊列的結構仍然是先進先出,這不是設計問題,是歷史上“隊列”的基準。

一次大膽的嘗試-物聯網隊列的誕生

我們需要一個實時優先的“隊列”用于IoT場景,它的想法不同于火箭和卡夫卡。我們必須發展:

1。實時生成消息先發送,累積消息進入降級模式

保序降級,不能保證整個消息序列,只有實時消息相對有序

累積消息,實時消息由并行任務發送。堆棧速率降級

實時消息發送失敗立即降級為堆棧消息

2。大規模主題

傳統隊列的核心點在于,無論堆的數量有多少,它都不會影響其性能;一旦kafka topic擁有了用多個原始消息按順序寫入文件的優勢,代理就會退化為隨機寫入,并失去其優勢。此外,zk在協調如此多的主題方面也是有限的。因此,這些隊列本身提供了一個插件代理橋。外部入口是多個設備主題,然后橋被映射到少量實際的卡夫卡主題。這個方案在某種程度上是可行的,但我們希望隔離效應只是暫時的解決辦法。

我們需要的是“將盡可能多的主題相互隔離,并且不影響整體性能”,并盡最大努力將主題從設備A中堆疊出來,而不影響設備B。上述方法基本上影響實際主題方面的設備。阿里云物聯網平臺今天首先面臨多租戶。10w郵件有影響。您是否影響一個制造商的10w設備或1w制造商的每個制造商的10W設備?這是完全不同的失效面。我們需要首先?;ぷ饣Ц衾?,然后才是設備隔離。我們不能通過設備Id完全分散多個隊列。最理想的情況是在裝備層面的話題數,然后是在億萬層面的話題數!

面向設備端的大眾話題與即時消息聊天系統略有相似,所以我們也提到了即時消息產品遇到的問題,比如阿里的內部手平移和釘釘。然而,最大的區別是現有產品基于它們自己的協議和客戶端,物聯網領域的硬件學生可能感覺更好,并且擁有不可控的終端。需要開源支持和物聯網SDK。

在最終的主題數量中也應考慮成本。我們希望主題數量幾乎是免費的!

我暫時不能確定這個產品是否是一個隊列,但是我們必須彌補當前隊列中的一些問題。

General idea

image.png

目前物聯網隊列沒有一個好名字。這被稱為服務訂閱,這意味著用戶向服務器訂閱他們的設備消息?;隊磁淖┩?。為了降低訪問成本,用戶可以使用符合開源生態的AMQP1.0協議進行訪問。

請注意,AMQP本身是一個消息協議,隊列可以使用AMQP作為協議,但是協議本身并不代表隊列。正如卡夫卡也可以用http消費一樣,這并不意味著http是卡夫卡式的隊列。AMQP1.0是最新的標準。它不僅是隊列本身,也是消息通信的統一消息標準。無論內核是隊列還是僅由提供者作為管道實現,AMQP1.0標準都逐漸應用于消息網關,隊列模型只是網關中的可選實現。

兼容傳統隊列和新隊列。讓用戶來推薦

事實上,這一套東西不再是每個人理解的“隊列”,也不是在一個維度上。然而,目前排隊的產品也在訪問設備,所以讓我們給你一個比較:

?

IoT隊列-訂閱AMQP KAFKA傳統隊列RocketMQ服務器部分,用于MQ

堆疊容量

大量堆疊消息將直接降級,堆疊消息不會影響實時消息,優先級恢復設備即時可用性

大量堆疊不會影響性能,突出性能點。當同一隊列被堆積時,實時生成的消息通常將被安排在隊列的末尾,直到堆積邏輯被處理,或者死消息“實時處理能力”與堆積處理分離。即使有積累,實時消息也會被首先推送,因此實時性能會相對更好。

當隊列累積時,實時消息一生成就成為累積隊列。消息的實時性要求“消費者必須快速恢復消費能力”

功能比較

云監控、消費者狀態、軌跡、多消費者群體、海量主題、無序-(簡單功能)

消息監控、消費者狀態、軌跡、多消費者群體、有限主題、可訂購(或有序劃分)、交易消息、廣播消息、死信等。-(更豐富)為什么Q

更適合物聯網實時優先級場景

1。當有大量積累時,設備的實時控制仍然可以保持一定的可用性,而不用特別擔心積累;2.大量的話題,一些設備消息的擁塞不應該影響整個隊列

1。當有大量積累時,用戶的第一反應通常是需要手動操作和維護來清除積累,以使系統再次可用;積累是一個“可怕的”網絡問題;2.在同一個業務場景中,多個主題被用來分割來模擬消息優先級的實現。如果一個主題堆積起來,多個設備仍然會受到影響;3.外部邏輯設備的多個主題被映射到內部有限主題,以治療暫時癥狀而非根本原因

Cost Comparison

依賴于OTS/HBASE的分布式存儲。代理本身不做存儲。單機性能較弱,需要利用集群來發揮性能;累積消息的性能是有限的,這取決于單個分區的掃描能力*底層存儲的分區數量。

broker本地異步/同步刷盤,IO性能很高,單機可以達到很高的QPS;單機性能優異;

Cost Comparison

1 .主題沒有開銷,當有大量主題可用時,成本更低,隔離性更好。2.當信息QPS更高時,成本就比卡夫卡更高;3.不利于小規模部署取決于許多

1 .由于資源的預先分配,主題具有成本和數量限制;“大主題”意識到底層不能通過共享一個主題而被很好地隔離。2.卡夫卡對每個帶寬收費最低;3.小型化部署成本低,對

消息策略-推-拉組合

image.png

依賴較少。此圖只是最基本的片段。從這個模式中,我們可以看到機制的不同。每個人都是對的,起點是不同的。

消息策略-推-拉組合

這應該是隊列的核心難點之一。與傳統隊列的區別在于,我們認為平臺模式和獨占資源太昂貴。然而,問題是消費者是不可控的,所以使用組合模式,只有當消費者在線時,累積的消息才會被提取,并且提取是由AMQP隊列網關完成的,該網關總是將過去的消息回調推送到用戶界面。

image.png

broker沒有直接讓消費者連接,而是去掉了隊列網關,這將更加靈活。即使對于一些用戶,我們的隊列也可以切換到ons、kafka和其他實現。Kafka和rocketmq在連接時為客戶端分配一個代理訪問地址。

2。消息是高度可用的:代理實時消息被首先推給消費者,失敗將落到隊列中;這是一個完整的事件,如果它沒有完成,將不會提供給生產者提交。如果出現中斷,發送方需要超時以決定重試。

3。異步確認

實時消息部分推送,基本上不會成為瓶頸,傳入消息進入堆疊模式。

KV存儲(ots、hbase)已用于底層,以解決存儲擴展問題。如何消除寫作熱點和消費

2.消費記錄按租戶的消費者ID (cid和sharding分區值決定),即同一個租戶消費組,可以調整sharding數量,一個sharding分區 是一個單線程任務處理,所以離線消息總消費速率取決于sharding數量,為了謹慎防止熱點,目前一個sharding跑1000QPS。 這里碰到過一些坑,比如寫前讀,尤其消費狀態更新問題。阿里云表格存儲在自增ID上做了不少優化, Hbase版本目前正在驗證。

3.實時消息“看起來沒落盤 會丟嗎” ,不是不落,是先推后看場景落。 每個發送給消費者的消息,都需要對方ack,如果異?;蛘叱泵揮寫鷥?,一個是落到堆積消息; 另外一個是這個過程如果都失敗,將直接告訴發送方失敗。

如何解決海量topic問題

首先面對“大量”的問題 一般都是考慮分區,單元化,分組等隔離和拆分,這里海量topic我們討論針對一個單實例模式下如何盡可能做到更多topic,完全任意數量都能100%沒問題肯定是不現實的。

海量的標準

這個標準起碼一個實例(4c8g ecs虛擬機)支撐10W設備規格,每個設備最多50topic,那么就是500w topic/起步。

由于broker和存儲已經隔離,broker和topic已經沒有什么關系,或者說任何topic數據生成,broker做的事情就是寫入和分發。

1.海量topic,每個topic有限數量訂閱: topic和訂閱者關系使用ots存儲加載redis或本地緩存,針對mqtt topic匹配有個topic tree的樹算法,hivemq有實現版本, 詳情參考 TopicTreeImpl.java

2.單個topic 海量訂閱: 這個場景其實是組播和廣播, 我們不會考慮在隊列本身上面去做這個事情,而是在上層封裝廣播組件來協調任務和批量發送。 簡單說就是每個消費者永遠訂閱自己topic,或者每個人都是自己的收件箱,你不能直接拿別人的;但是我可以一份消息發到多個人的收件箱(topic)里面去。如果是100w topic數量級別,一般使用上面的topic tree能在本地內存構造快速匹配。但平臺化這個量級是不夠的,所以全局的海量廣播需要在上層構建任務系統來做。這個廣播目前還在建設中。

回壓

實時消息推送fail,將會進入堆積,如果超時或操作失敗,由于producer沒有收到commit可以決定重試。假如設備是Mqtt協議可以利用qos1,如果borker未推送成功或者寫入堆積失敗 不給producer ack,那么producer會重試。但是解決不了其它協議或者qos0消息, 這里還有個優化點是在發送方網關來做推送消息的failover ack機制。 由于producer的客戶端是開源sdk,不受管控 這個地方是一個局限點。

尤其面向碎片化的設備端協議,回壓不能完全依賴設備端機制,有了發送方網關后,我們可以在這里干些活。篇幅有限這里先不展開了。

監控運維

這塊云上集成云監控、專有云使用云生態Prometheus等構造

未來探索點

隊列網關除了支持AMQP,也支持KAFKA協議,面向開發者編程接口更貼切。 (注意只是kafka的消息protocol,我們絕對沒有能力去做一個一樣的kafka隊列)

總結

IoT場景的隊列實踐,在現有mq隊列、kafka隊列融合互補之外,加了種自有的實時優先隊列實現;同時加入了隊列網關代理,即能讓用戶選擇市面上隊列,也可以選擇輕便的IoT隊列??贍芪野顏飧鲆步小岸恿小輩皇嗆芴?,目前只是實現了基本功能,還需要進一步完善和打磨。 再次強調,本文沒有說目前隊列做得不好,我們系統內部環節也在享受已有隊列產品的服務,比如我們系統內部自己某些分支的FO就可能利用了rocketmq或者kafka,只是在某些場景化方向 我們做了些微小的探索,希望能解決更多用戶問題。

成人視頻在線播放|成人視頻免費觀看|四虎國產精 亞洲一區偷自



{ganrao} 长沙按摩会所排行榜 巴蜀麻将上下分模式 大桥未久爬玻璃3分钟 乌鲁木齐一条龙桑拿服务 全民南平麻将 2019女优新人排行 冲田杏梨 四人打麻将在线游戏 江苏7位数开奖结果图电脑版 线上股票配资选哪家 2009掘金vs小牛 广西十一选五结果 今日上证指数000001 竞彩足球比分预测投注 7星彩30期开奖结果 极速11选5送彩金