日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高可用延迟队列设计与实现

發(fā)布時間:2025/1/21 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高可用延迟队列设计与实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

延遲隊列:一種帶有?延遲功能?的消息隊列

  • 延時 → 未來一個不確定的時間
  • mq → 消費行為具有順序性
  • 這樣解釋,整個設計就清楚了。你的目的是 延時,承載容器是 mq。

    背景

    列舉一下我日常業(yè)務中可能存在的場景:

  • 建立延時日程,需要提醒老師上課
  • 延時推送 → 推送老師需要的公告以及作業(yè)
  • 為了解決以上問題,最簡單直接的辦法就是定時去掃表:

    服務啟動時,開啟一個異步協(xié)程 → 定時掃描 msg table,到了事件觸發(fā)事件,調用對應的 handler

    幾個缺點:

  • 每一個需要定時/延時任務的服務,都需要一個 msg table 做額外存儲 → 存儲與業(yè)務耦合
  • 定時掃描 → 時間不好控制,可能會錯過觸發(fā)時間
  • 對 msg table instance 是一個負擔。反復有一個服務不斷對數(shù)據(jù)庫產生持續(xù)不斷的壓力
  • 最大問題其實是什么?

    調度模型基本統(tǒng)一,不要做重復的業(yè)務邏輯

    我們可以考慮將邏輯從具體的業(yè)務邏輯里面抽出來,變成一個公共的部分。

    而這個調度模型,就是?延時隊列?。

    其實說白了:

    延時隊列模型,就是將未來執(zhí)行的事件提前存儲好,然后不斷掃描這個存儲,觸發(fā)執(zhí)行時間則執(zhí)行對應的任務邏輯。

    那么開源界是否已有現(xiàn)成的方案呢?答案是肯定的。Beanstalk (https://github.com/beanstalkd/beanstalkd) 它基本上已經滿足以上需求

    設計目的

  • 消費行為 at least
  • 高可用
  • 實時性
  • 支持消息刪除
  • 依次說說上述這些目的的設計方向:

    消費行為

    這個概念取自 mq 。mq 中提供了消費投遞的幾個方向:

    • at most once?→ 至多一次,消息可能會丟,但不會重復
    • at least once?→ 至少一次,消息肯定不會丟失,但可能重復
    • exactly once?→ 有且只有一次,消息不丟失不重復,且只消費一次。

    exactly once?盡可能是 producer + consumer 兩端都保證。當 producer 沒辦法保證是,那 consumer 需要在消費前做一個去重,達到消費過一次不會重復消費,這個在延遲隊列內部直接保證。

    最簡單:使用 redis 的 setNX 達到 job id 的唯一消費

    高可用

    支持多實例部署。掛掉一個實例后,還有后備實例繼續(xù)提供服務。

    這個對外提供的 API 使用 cluster 模型,內部將多個 node 封裝起來,多個 node 之間冗余存儲。

    為什么不使用 kafka?

    考慮過類似基于 kafka/rocketmq 等消息隊列作為存儲的方案,最后從存儲設計模型放棄了這類選擇。

    舉個例子,假設以 Kafka 這種消息隊列存儲來實現(xiàn)延時功能,每個隊列的時間都需要創(chuàng)建一個單獨的 topic(如: Q1-1s, Q1-2s..)。這種設計在延時時間比較固定的場景下問題不太大,但如果是延時時間變化比較大會導致 topic 數(shù)目過多,會把磁盤從順序讀寫會變成隨機讀寫從導致性能衰減,同時也會帶來其他類似重啟或者恢復時間過長的問題。

  • topic 過多 → 存儲壓力
  • topic 存儲的是現(xiàn)實時間,在調度時對不同時間 (topic) 的讀取,順序讀 → 隨機讀
  • 同理,寫入的時候順序寫 → 隨機寫
  • 架構設計

    API 設計

    producer

  • producer.At(msg []byte, at time.Time)
  • producer.Delay(body []byte, delay time.Duration)
  • producer.Revoke(ids string)
  • consumer

  • consumer.Consume(consume handler)
  • 使用延時隊列后,服務整體結構如下,以及隊列中 job 的狀態(tài)變遷:

  • service →?producer.At(msg []byte, at time.Time)?→ 插入延時job到 tube 中
  • 定時觸發(fā) → job 狀態(tài)更新為 ready
  • consumer 獲取到 ready job → 取出 job,開始消費;并更改狀態(tài)為 reserved
  • 執(zhí)行傳入 consumer 中的 handler 邏輯處理函數(shù)
  • 生產實踐

    主要介紹一下在日常開發(fā),我們使用到延時隊列的哪些具體功能。

    生產端

  • 開發(fā)中生產延時任務,只需確定任務執(zhí)行時間
  • 傳入 At()?producer.At(msg []byte, at time.Time)
  • 內部會自行計算時間差值,插入 tube
  • 如果出現(xiàn)任務時間的修改,以及任務內容的修改
  • 在生產時可能需要額外建立一個 logic_id → job_id 的關系表
  • 查詢到 job_id →?producer.Revoke(ids string)?,對其刪除,然后重新插入
  • 消費端

    首先,框架層面保證了消費行為的?exactly once?,但是上層業(yè)務邏輯消費失敗或者是出現(xiàn)網絡問題,亦或者是各種各樣的問題,導致消費失敗,兜底交給業(yè)務開發(fā)做。這樣做的原因:

  • 框架以及基礎組件只保證 job 狀態(tài)的流轉正確性
  • 框架消費端只保證消費行為的統(tǒng)一
  • 延時任務在不同業(yè)務中行為不統(tǒng)一
  • 強調任務的必達性,則消費失敗時需要不斷重試直到任務成功
  • 強調任務的準時性,則消費失敗時,對業(yè)務不敏感則可以選擇丟棄
  • 這里描述一下框架消費端是怎么保證消費行為的統(tǒng)一:

    分為 cluster 和 node。cluster

    https://github.com/tal-tech/go-queue/blob/master/dq/consumer.go#L45

  • cluster 內部將 consume handler 做了一層再封裝
  • 對 consume body 做hash,并使用此 hash 作為 redis 去重的key
  • 如果存在,則不做處理,丟棄
  • node

    go-queue/consumernode.go at master · tal-tech/go-queue · GitHub

  • 消費 node 獲取到 ready job;先執(zhí)行 Reserve(TTR),預訂此job,將執(zhí)行該job進行邏輯處理
  • 在 node 中 delete(job);然后再進行消費
  • 如果失敗,則上拋給業(yè)務層,做相應的兜底重試
  • 所以對于消費端,開發(fā)者需要自己實現(xiàn)消費的冪等性。

    總結

    以上是生活随笔為你收集整理的高可用延迟队列设计与实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲一区二区三区在线播放 | 69xxx免费视频 | 四虎影院在线观看免费 | 播金莲一级淫片aaaaaaa | 毛片aaaa| 男人撒尿视频xvideos | 麻豆影音 | 在线免费视频一区 | 欧美特级特黄aaaaaa在线看 | 夜夜欢天天干 | 最新av网站在线观看 | 在线观看免费av片 | 波多野结衣在线影院 | 亚洲一区二区免费 | 性福利视频 | 黄色视屏软件 | 吻胸摸激情床激烈视频 | 99热18| 国产美女流白浆 | a级在线观看视频 | 又大又粗欧美黑人aaaaa片 | 久久久精品区 | 国产又粗又猛又黄又爽的视频 | 成人无码视频 | 人人妻人人澡人人爽精品 | 超碰男人的天堂 | 成人夜色视频 | 亚洲天堂精品视频 | 国产高清不卡一区 | 国产精品69毛片高清亚洲 | 欧美日韩视频在线观看免费 | 欧美性猛交 | 动漫美女被到爽 | 国产一区在线视频观看 | 91av福利 | 亚洲aⅴ乱码精品成人区 | 亚洲另类天堂 | 欧性猛交ⅹxxx乱大交 | 国产一二视频 | 五月天婷婷激情视频 | 欧美a级网站| 中文字幕欧美日韩 | 福利影院在线观看 | 成年人黄色免费视频 | 色妞在线 | 久久精品日 | 1000亚洲裸体人体 | 摸摸摸bbb毛毛毛片 午夜爽爽影院 | 91蜜臀精品国产自偷在线 | 国产无遮挡呻吟娇喘视频 | 黄色片免费在线播放 | 国产在线观看一区 | 91精品一区二区三区综合在线爱 | www.麻豆av | 色婷婷一区 | xxxx国产视频 | 亚洲精品国产欧美在线观看 | 欧美精品一区二区蜜臀亚洲 | 天天艹夜夜艹 | 亚洲精品麻豆 | 黄色一节片 | 激情久久久久 | 成人xxx| 成色网 | 日噜| 日韩一级黄色 | 51精品 | 操大逼网站 | jizz欧美性23| 理论片第一页 | 日日夜夜操操 | 91在线观看视频 | 黄色大视频 | 91中文字幕在线观看 | 乌克兰av在线 | 亚洲小说图片区 | 美日韩在线 | 两性午夜免费视频 | 亚洲自拍偷拍网站 | 日韩精品在线视频观看 | 亚洲热影院 | aa毛片视频| 免费一级欧美 | 亚洲av成人无码一二三在线观看 | 特黄一级片 | av免费在线电影 | 天堂av电影在线观看 | 亚洲视频一区在线 | av免费在线观看网站 | 99人妻碰碰碰久久久久禁片 | 成人精品亚洲 | 精品视频在线免费观看 | 国产成人自拍一区 | 咪咪av| 97视频人人 | 国产98色在线 | 日韩 | 双性人bbww欧美双性 | 91麻豆网站 | 张柏芝54张无删码视频 |