筆記速覽 訊息佇列的問題

2021-09-25 23:33:55 字數 2091 閱讀 1153

總結自:中華石衫

如何保證訊息佇列的高可用啊?

缺點:

* 導致系統可用性降低

就kafka來說:

* ha機制,就是replica副本機制

* isr

* leader 掛了咋辦? broker掛了咋辦? controller掛了咋辦?

訊息佇列重複消費?如何保證訊息不被重複消費啊(如何保證訊息消費時的冪等性)

* 原因 :任務重啟,offset提交有間隔,導致部分資料被重複消費

* 措施 :訊息佇列不保證重複資料,所以要開發一套 冪等性 機制

* 如果 是 redis,不用考慮,因為 redis 天然冪等性

* 業務上 每條資料 都生成唯一的id,每次處理資料的時候去快取(記憶體、redis)中查,看有沒有處理過

如何保證訊息的可靠性傳輸(如何處理訊息丟失的問題)?

* 生產者弄丟了資料

ack=all,一定不會丟

* kafka 服務端丟資料(crash)

kafka的leader機器宕機了,將follower切換為leader之後,發現資料丟了

下面四個引數必須保證:

kafka服務端 replication.factor :這個值必須大於1,要求每個partition必須有至少2個副本

kafka服務端 min.insync.replicas :這個值必須大於1,這個是要求乙個leader至少感知到有至少乙個follower還跟自己保持聯絡,沒掉隊,這樣才能確保leader掛了還有乙個follower

producer端 acks=all:這個是要求每條資料,必須是寫入所有replica之後,才能認為是寫成功了

producer端 retries=max:這個是要求一旦寫入失敗,就無限重試,卡在這裡了

* 消費端弄丟了資料

原因:kafka只有一種可能:offset自動提交,但是處理資料的時候consumer掛了,那訊息就丟了

解決:關閉 kafka offset 自動提交,在處理完資料的時候提交。針對此時 consumer 掛了會出現重複消費的情況,用冪等性保證

如果保證從佇列裡拿到的資料按順序執行?就kafka來說

* partition 裡的資料肯定有序,kafka 不保證 多個 partition 裡資料的有序性

* partition - consumer 一一對應,如果 kafka consumer 單執行緒 消費 + 處理,可能會影響 消費速度

* 當 consumer 只負責 取資料,取完資料丟 queue 裡面,處理執行緒從 queue 裡面取資料處理,可加快速度(queue可以有多個,queue - 處理執行緒 一一對應)

* 此時 要將 需要 有序的資料,放在 同乙個queue 裡面

大量訊息在mq裡積壓了幾個小時了還沒解決?

-- 臨時緊急擴容
資料會大量積壓在mq裡,而是大量的資料會直接搞丟?

-- ttl 盡量不要設

-- 手動寫程式,補資料

走的方式是訊息積壓在mq裡,那麼如果你很長時間都沒處理掉,此時導致mq都快寫滿了,咋辦?

-- 消費到的資料就扔,達到快速消費目的

-- 消費到的資料就存(資料遷移系統),後期補資料

如果讓你寫乙個訊息佇列,該如何進行架構設計啊?思路是什麼?

關鍵點:

* 基本功能

生產者消費者,維護佇列

* 支援伸縮性:在需要的時候進行擴容

參照 kafka 分布式系統,broker -> topic -> partition,每個 partition 分布在不同的機器上,只存一部分資料。

資源不夠則 增加 partition,增加機器

* 資料持久化

順序落盤,提高磁碟讀寫效能; index 和 log 檔案,加快 速度

* 可用性,ha

replication , leader 掛了咋辦? broker掛了咋辦? controller掛了咋辦?

* 支援資料零丟失方案

caffe 速覽筆記

blob與tensorflow中的tensor類似,都是用來在節點之間傳遞資料所用,介面也類似,常規的dimension是 資料量n x 通道k x 高度h x 寬度w blob內部存有data和diff兩大塊。前者是傳遞的資料,後者是計算的梯度。由於blob同時存在cpu和gpu,所以有兩種方式來...

筆記 python模組速覽

有些東西,可能不經常用,尤其對於像我這種剛學的小夥伴來說更是如此。對於這部分內容可以不會用,但是一定要了解有這個東西,知道這個東西是什麼,能幹什麼,當我需要的時候可以想到,這個東西可以派上用場,到時再深入學習也為時不晚。目錄 常用內建模組 datetime collections base64 st...

Git命令速覽 git筆記

版本控制系統 vcs 在 git 中的絕大多數操作都只需要訪問本地檔案和資源,不用連網。但如果用 cvcs 的話,差不多所有操作都需要連線網路。因為 git 在本地磁碟上就儲存著所有當前專案的歷史更新,所以處理起來速度飛快。對於任何乙個檔案,在 git 內都只有三種狀態 已提交 committed ...