乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      30分鐘帶你了解「消息中間件」Kafka、RocketMQ

       Coder編程 2021-05-13

      消息中間件的應(yīng)用場景

      • 異步解耦
      • 削峰填谷
      • 順序收發(fā)
      • 分布式事務(wù)一致性

      騰訊應(yīng)用案例:

      主流 MQ 框架及對比

      說明

      • Kafka:整個行業(yè)應(yīng)用廣泛
      • RocketMQ:阿里,從 apache 孵化
      • Pulsar:雅虎開源,符合云原生架構(gòu)的消息隊列,社區(qū)活躍
      • RabbitMQ 架構(gòu)比較老,AMQP并沒有在主流的 MQ 得到支持
      • NSQ:內(nèi)存型,不是最優(yōu)選擇
      • ActiveMQ、ZeroMQ 可忽略

      Kafka 優(yōu)點(diǎn)

      • 非常成熟,生態(tài)豐富,與 Hadoop 連接緊密
      • 吞吐非常高,可用性高
        • sharding
        • 提升 replication 速度
      • 主要功能:pub-sub,壓縮支持良好
      • 可按照 at least once, at most once 進(jìn)行配置使用,exactly once 需要 Consumer 配合
      • 集群部署簡單,但 controller 邏輯很復(fù)雜,實現(xiàn)partition 的多副本、數(shù)據(jù)一致性
      • controller 依賴 ZooKeeper
      • 異步刷磁盤(除了錢的業(yè)務(wù),很少有同步 flush 的需求)

      Kafka 缺點(diǎn)

      • 寫入延時穩(wěn)定性問題,partition 很多時
        • Kafka 通常用機(jī)械盤,隨機(jī)寫造成吞吐下降和延時上升
        • 100ms ~ 500ms
      • 運(yùn)維的復(fù)雜性
        • 單機(jī)故障后補(bǔ)充副本
        • 數(shù)據(jù)遷移
        • 快手的優(yōu)化:遷移 partition 時舊數(shù)據(jù)不動,新數(shù)據(jù)寫入新 partition 一定時間后直接切換

      RocketMQ

      • 阿里根據(jù) Kafka 改造適應(yīng)電商等在線業(yè)務(wù)場景
      • 以犧牲性能為代價增強(qiáng)功能
        • 按 key 對消息查詢,維護(hù) hash 表,影響 io
        • 為了在多 shard 場景下保證寫入延遲穩(wěn)定,在 broker 級別將所有 shard 當(dāng)前寫入的數(shù)據(jù)放入一個文件,形成 commitlog list,放若干個 index 文件維護(hù)邏輯 topic 信息,造成更多的隨機(jī)讀
      • 沒有中心管理節(jié)點(diǎn),現(xiàn)在看起來并沒有什么用,元數(shù)據(jù)并不多
      • 高精度的延遲消息(快手已支持秒級精度的延遲消息)

      Pulsar

      • 存儲、計算分離,方便擴(kuò)容
        • 存儲:bookkeeper
        • MQ邏輯:無狀態(tài)的 broker 處理

      發(fā)展趨勢

      • 云原生
      • 批流一體:跑任務(wù)時,需要先把 Kafka 數(shù)據(jù)→HDFS,資源消耗大。如果本來就存在 HDFS,能節(jié)省很大資源
      • Serverless

      各公司發(fā)展

      • 快手:Kafka
        • 所有場景均在使用
        • 特殊形態(tài)的讀寫分離
          • 數(shù)據(jù)實時消費(fèi)到 HDFS
          • 在有明顯 lag 的 consumer 讀取時,broker 把請求從本地磁盤轉(zhuǎn)發(fā)的 HDFS
          • 不會因為有 lag 的 consumer 對日常讀寫造成明顯的磁盤隨機(jī)讀寫
        • 由于自己改造,社區(qū)新功能引入困難
      • 阿里巴巴:開源 RocketMQ
      • 字節(jié)跳動
        • 在線場景:NSQ→RocketMQ
        • 離線場景:Kafka→自研的存儲計算分類的 BMQ(協(xié)議層直接兼容Kafka,用戶可以不換 client)
      • 百度:自研的 BigPipe,不怎么樣
      • 美團(tuán):Kafka 架構(gòu)基礎(chǔ)上用 Java 進(jìn)行重構(gòu),內(nèi)部叫 Mafka
      • 騰訊:部分使用了自研的 PhxQueue,底層是 KV 系統(tǒng)
      • 滴滴:DDMQ
        • 對 RocketMQ 和 Kafka 進(jìn)行封裝
        • 多機(jī)房數(shù)據(jù)一致性可能有問題
      • 小米:自研 Talos
        • 架構(gòu)類似 pulsar,存儲是 HDFS,讀場景有優(yōu)化

      Kafka

      Kafka 是什么?

      • 開源的消息引擎系統(tǒng)(消息隊列/消息中間件)
      • 分布式流處理平臺
      • 發(fā)布/訂閱模型
      • 削峰填谷

      Kafka 術(shù)語

      • Topic:發(fā)布訂閱的主題
      • Producer:向Topic發(fā)布消息的客戶端
      • Consumer:消費(fèi)者
      • Consumer Group:消費(fèi)者組,多個消費(fèi)者共同組成一個組
      • Broker:Kafka的服務(wù)進(jìn)程
      • Replication:備份,相同數(shù)據(jù)拷貝到多臺機(jī)器
        • Leader Replica
        • Follower Replica,不與外界交互
      • Partition:分區(qū),解決伸縮性問題,多個Partition組成一個Topic
      • Segment:partition 由多個 segment 組成

      Kafka 如何持久化?

      • 消息日志(Log)保存數(shù)據(jù),磁盤追加寫(Append-only)
        • 避免緩慢的隨機(jī)I/O操作
        • 高吞吐
      • 定期刪除消息(日志段)

      Kafka 文件存儲機(jī)制

      https://www./lib/view/open1421150566328.html

      • 每個 partition 相當(dāng)于一個巨型文件→多個大小相等 segment 數(shù)據(jù)文件中
      • 每個 partition 只需要順序讀寫就行了,segment 文件生命周期由配置決定
      • segment file 組成:
        • index file:索引文件
        • data file:數(shù)據(jù)文件
      • segment file 文件命名規(guī)則:
        • 全局第一個 segment 是 0
        • 后序每個加上全局 partition 的最大 offset

      一對 segment file

      message 物理結(jié)構(gòu)

      分區(qū)

      為什么分區(qū)?

      • Kafka的消息組織方式:主題-分區(qū)-消息
      • 一條消息,僅存在某一個分區(qū)中
      • 提高伸縮性,不同分區(qū)可以放到不同機(jī)器,讀寫操作也是以分區(qū)粒度

      分區(qū)策略?

      • 輪詢
      • 隨機(jī)
      • 按 key 保序,單分區(qū)有序

      Kafka 是否會消息丟失?

      • 只對“已提交”的消息做有限度的持久化保證
        • 已提交的消息:消息寫入日志文件
        • 有限度的持久化保證:N個 broker 至少一個存活
      • 生產(chǎn)者丟失數(shù)據(jù)
        • producer.send(msg) 異步發(fā)送消息,不保證數(shù)據(jù)到達(dá)Kafka
        • producer.send(msg, callback) 判斷回調(diào)
      • 消費(fèi)者程序丟失數(shù)據(jù)
        • 應(yīng)該「先消費(fèi)消息,后更新位移的順序」
        • 新問題:消息的重復(fù)處理
        • 多線程異步處理消息,Consumer不要開啟自動提交位移,應(yīng)用程序手動提交位移

      控制器

      • 在 ZooKeeper幫助下管理和協(xié)調(diào)整個 Kafka 集群
      • 運(yùn)行過程中,只能有一個 Broker 成為控制器

      控制器如何選舉?

      在 ZooKeeper 創(chuàng)建 /controller 節(jié)點(diǎn),第一個創(chuàng)建成功的 Broker 被指定為控制器。

      控制器有什么用?

      • 主題管理(創(chuàng)建、刪除、增加分區(qū))
      • 分區(qū)重分配
      • 領(lǐng)導(dǎo)者選舉
      • 集群成員管理(新增 Broker、Broker 主動關(guān)閉、Broker 宕機(jī))(ZooKeeper 臨時節(jié)點(diǎn))
      • 數(shù)據(jù)服務(wù):最全的集群元數(shù)據(jù)信息

      控制器故障轉(zhuǎn)移

      • 只有一個 Broker 當(dāng)控制器,單點(diǎn)失效,立即啟用備用控制器

      Kafka 的 ZooKeeper 存儲結(jié)構(gòu)

      分布式事務(wù)的應(yīng)用場景

      • 團(tuán)隊內(nèi)部,某些操作要同時更新多個數(shù)據(jù)源
      • 業(yè)務(wù)團(tuán)隊 A 完成某個操作后,B 業(yè)務(wù)的某個操作也必須完成,A 業(yè)務(wù)并不能直接訪問 B 的數(shù)據(jù)庫
      • 公司之間,用戶付款后,支付系統(tǒng)(支付寶/微信)必須通知商家的系統(tǒng)更新訂單狀態(tài)

      兩階段最終一致

      • 先完成數(shù)據(jù)源 A 的事務(wù)(一階段)
      • 成功后通過某種機(jī)制,保證數(shù)據(jù)源 B 的事務(wù)(二階段)也一定最終完成
        • 不成功,會不斷重試直到成功為止
        • 或達(dá)到一定重試次數(shù)后停止(配合對賬、人工處理)

      如何保證最終一致?

      為了保證最終一致,消息系統(tǒng)和業(yè)務(wù)程序需要保證:

      • 消息發(fā)送的一致性:消息發(fā)送時,一階段事務(wù)和消息發(fā)送必須同時成功或失敗
      • 消息存儲不丟失:消息發(fā)送成功后,到消息被成功消費(fèi)前,消息服務(wù)器(broker)必須存儲好消息,保證發(fā)生故障時,消息不丟失
      • 消費(fèi)者不丟失消息:處理失敗不丟棄,重試直到成功為止

      消息發(fā)送的一致性如何保證?

      目標(biāo):本地事務(wù)、消息發(fā)送必須同時成功/失敗

      問題

      • 先執(zhí)行本地事務(wù),再發(fā)送消息,消息可能發(fā)送失敗
      • 可把失敗的消息放入內(nèi)存,稍后重試,但成功率也無法達(dá)到 100%

      解決方案`* 先發(fā)送半消息(Half Msg,類似 Prepare 操作),不會投遞給消費(fèi)者

      • 半消息發(fā)送成功,再執(zhí)行 DB 操作
      • DB 操作執(zhí)行成功后,提交半消息

      發(fā)送異常會如何?

      • 1 異常,半消息發(fā)送失敗,本地 DB 沒有執(zhí)行,整個操作失敗,DB/消息的狀態(tài)一致(都沒有提交)
      • 2 異常/超時
        • 生產(chǎn)者以為失敗了,不執(zhí)行 DB
        • broker 存儲半消息成功,等不到后序操作,會詢問生產(chǎn)者是提交還是回滾(第6步)
      • 3 DB操作失?。荷a(chǎn)者在第 4 步告知 broker 回滾半消息
      • 4 提交/回滾半消息失?。篵roker 等不到這個操作,觸發(fā)回查(第 6 步)
      • 5、6、7回查失?。篟ocketMQ 最多回查 15 次

      代碼、思維導(dǎo)圖筆記鏈接

      代碼和思維導(dǎo)圖在 GitHub 項目中,歡迎大家 star!

      coding 筆記、點(diǎn)滴記錄,以后的文章也會同步到公眾號(Coding Insight)中,希望大家關(guān)注_

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多