中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

好用的免費(fèi)建站網(wǎng)站百度網(wǎng)絡(luò)營(yíng)銷中心

好用的免費(fèi)建站網(wǎng)站,百度網(wǎng)絡(luò)營(yíng)銷中心,余江區(qū)建設(shè)局網(wǎng)站,網(wǎng)站如何做頁數(shù)文章目錄 1、如何知道有消息丟失?2、哪些環(huán)節(jié)可能丟消息?3、如何確保消息不丟失? 引入 MQ 消息中間件最直接的目的:系統(tǒng)解耦以及流量控制(削峰填谷) 系統(tǒng)解耦: 上下游系統(tǒng)之間的通信相互依賴&a…

文章目錄

  • 1、如何知道有消息丟失?
  • 2、哪些環(huán)節(jié)可能丟消息?
  • 3、如何確保消息不丟失?


引入 MQ 消息中間件最直接的目的:系統(tǒng)解耦以及流量控制(削峰填谷)

  • 系統(tǒng)解耦: 上下游系統(tǒng)之間的通信相互依賴,利用 MQ 消息隊(duì)列可以隔離上下游環(huán)境變化帶來的不穩(wěn)定因素。
  • 流量控制: 超高并發(fā)場(chǎng)景中,引入 MQ 可以實(shí)現(xiàn)流量 “削峰填谷” 的作用以及服務(wù)異步處理,不至于打崩服務(wù)。

引入 MQ 同樣帶來其他問題:數(shù)據(jù)一致性。

在分布式系統(tǒng)中,如果兩個(gè)節(jié)點(diǎn)之間存在數(shù)據(jù)同步,就會(huì)帶來數(shù)據(jù)一致性的問題。消息生產(chǎn)端發(fā)送消息到 MQ 再到消息消費(fèi)端需要保證消息不丟失。

在這里插入圖片描述
所以在使用 MQ 消息隊(duì)列時(shí),需要考慮這 3 個(gè)問題:

  • 如何知道有消息丟失?
  • 哪些環(huán)節(jié)可能丟消息?
  • 如何確保消息不丟失?

在這里插入圖片描述

1、如何知道有消息丟失?

如何感知消息是否丟失了?可總結(jié)如下:

  1. 他人反饋: 運(yùn)營(yíng)、PM 反饋消息丟失。
  2. 監(jiān)控報(bào)警: 監(jiān)控指定指標(biāo),即時(shí)報(bào)警人工調(diào)整。Kafka 集群異常、Broker 宕機(jī)、Broker 磁盤掛載問題、消費(fèi)者異常導(dǎo)致消息積壓等都會(huì)給用戶直接感覺是消息丟失了。

案例:輿情分析中數(shù)據(jù)采集同步
在這里插入圖片描述

  • PM 可自己下發(fā)采集調(diào)度指令,去采集特定數(shù)據(jù)。
  • PM 可通過 ES 近實(shí)時(shí)查詢對(duì)應(yīng)數(shù)據(jù),若沒相應(yīng)數(shù)據(jù)可再次下發(fā)指令。

當(dāng)感知消息丟失了,那就需要一種機(jī)制來檢查消息是否丟失。

檢索消息

運(yùn)維工具有:

1.查看 Kafka 消費(fèi)位置:

# 查看某個(gè)topic的message數(shù)量
$ ./kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic test_topic# 查看consumer Group列表,面試寶典:https://www.yoodb.com
$ ./kafka-consumer-groups.sh  --list  --bootstrap-server 192.168.88.108:9092# 查看 offset 消費(fèi)情況
$ ./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group console-consumer-1152 --describe
GROUP                 TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                                           HOST            CLIENT-ID
console-consumer-1152 test_topic      0          -               4               -               consumer-console-consumer-1152-1-2703ea2b-b62d-4cfd-8950-34e8c321b942 /127.0.0.1      consumer-console-consumer-1152-1

2.利用工具:Kafka Tools

在這里插入圖片描述
3.其他可見化界面工具

2、哪些環(huán)節(jié)可能丟消息?

一條消息從生產(chǎn)到消費(fèi)完成經(jīng)歷 3 個(gè)環(huán)節(jié):消息生產(chǎn)者、消息中間件、消息消費(fèi)者。

在這里插入圖片描述
哪個(gè)環(huán)節(jié)都有可能出現(xiàn)消息丟失問題。

1)生產(chǎn)端
首先要認(rèn)識(shí)到 Kafka 生產(chǎn)端發(fā)送消息流程:

調(diào)用 send() 方法時(shí),不會(huì)立刻把消息發(fā)送出去,而是緩存起來,選擇恰當(dāng)時(shí)機(jī)把緩存里的消息劃分成一批數(shù)據(jù),通過 Sender 線程按批次發(fā)送給服務(wù)端 Broker。

在這里插入圖片描述

此環(huán)節(jié)丟失消息的場(chǎng)景有: 即導(dǎo)致 Producer 消息沒有發(fā)送成功

1.網(wǎng)絡(luò)波動(dòng): 生產(chǎn)者與服務(wù)端之間的鏈路不可達(dá),發(fā)送超時(shí)。現(xiàn)象是:各端狀態(tài)正常,但消費(fèi)端就是沒有消費(fèi)消息,就像丟失消息一樣。

2.解決措施: 重試 props.put(“retries”, “10”);

3.不恰當(dāng)配置: 發(fā)送消息無 ack 確認(rèn); 發(fā)送消息失敗無回調(diào),無日志。

producer.send(new ProducerRecord<>(topic, messageKey, messageStr), new CallBack(){...});

4.解決措施: *設(shè)置 acks=1 或者 acks=all。發(fā)送消息設(shè)置回調(diào)。

回顧下重要的參數(shù): acks

  • acks=0:不需要等待服務(wù)器的確認(rèn). 這是 retries設(shè)置無效. 響應(yīng)里來自服務(wù)端的 offset 總是 -1producer只管發(fā)不管發(fā)送成功與否。延遲低,容易丟失數(shù)據(jù)。
  • acks=1:表示 leader 寫入成功(但是并沒有刷新到磁盤)后即向 producer 響應(yīng)。延遲中等,一旦 leader 副本掛了,就會(huì)丟失數(shù)據(jù)。
  • acks=all:等待數(shù)據(jù)完成副本的復(fù)制, 等同于 -1. 假如需要保證消息不丟失, 需要使用該設(shè)置. 同時(shí)需要設(shè)置 unclean.leader.election.enabletrue, 保證當(dāng) ISR 列表為空時(shí), 選擇其他存活的副本作為新的 leader.

2)服務(wù)端
先來了解下 Kafka Broker 寫入數(shù)據(jù)的過程:

1.Broker接收到一批數(shù)據(jù),會(huì)先寫入內(nèi)存 PageCacheOS Cache)中。
2.操作系統(tǒng)會(huì)隔段時(shí)間把 OS Cache 中數(shù)據(jù)進(jìn)行刷盤,這個(gè)過程會(huì)是 「異步批量刷盤」 。

在這里插入圖片描述
這里就有個(gè)隱患,如果數(shù)據(jù)寫入 PageCache 后 Kafka Broker宕機(jī)會(huì)怎樣?機(jī)子宕機(jī)/掉電?

Kafka Broker 宕機(jī): 消息不會(huì)丟失。因?yàn)閿?shù)據(jù)已經(jīng)寫入 PageCache,只等待操作系統(tǒng)刷盤即可。
機(jī)子宕機(jī)/掉電: 消息會(huì)丟失。因?yàn)閿?shù)據(jù)仍在內(nèi)存里,內(nèi)存RAM掉電后就會(huì)丟失數(shù)據(jù)。

  • 解決方案 :使用帶蓄電池后備電源的緩存 cache,防止系統(tǒng)斷電異常。

1.對(duì)比學(xué)習(xí) MySQL 的 “雙1” 策略,基本不使用這個(gè)策略,因?yàn)?“雙1” 會(huì)導(dǎo)致頻繁的 I/O 操作,也是最慢的一種。
2.對(duì)比學(xué)習(xí) Redis AOF 策略,默認(rèn)且推薦的策略:Everysec(AOF_FSYNC_EVERYSEC) 每一秒鐘保存一次(默認(rèn)): 。每個(gè)寫命令執(zhí)行完,
只是先把日志寫到 AOF 文件的內(nèi)存緩沖區(qū), 每隔一秒把緩沖區(qū)中的內(nèi)容寫入磁盤。

拓展:Kafka 日志刷盤機(jī)制

# 推薦采用默認(rèn)值,即不配置該配置,交由操作系統(tǒng)自行決定何時(shí)落盤,以提升性能。
# 針對(duì) broker 配置:
log.flush.interval.messages=10000 # 日志落盤消息條數(shù)間隔,即每接收到一定條數(shù)消息,即進(jìn)行l(wèi)og落盤。
log.flush.interval.ms=1000        # 日志落盤時(shí)間間隔,單位ms,即每隔一定時(shí)間,即進(jìn)行l(wèi)og落盤。# 針對(duì) topic 配置:面試寶典:https://www.yoodb.com
flush.messages.flush.ms=1000  # topic下每1s刷盤
flush.messages=1              # topic下每個(gè)消息都落盤# 查看 Linux 后臺(tái)線程執(zhí)行配置
$ sysctl -a | grep dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10      # 表示當(dāng)臟頁占總內(nèi)存的的百分比超過這個(gè)值時(shí),后臺(tái)線程開始刷新臟頁。
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000    # 表示臟數(shù)據(jù)多久會(huì)被刷新到磁盤上(30秒)。
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500  # 表示多久喚醒一次刷新臟頁的后臺(tái)線程(5秒)。
vm.dirtytime_expire_seconds = 43200

Broker 的可靠性需要依賴其多副本機(jī)制: 一般副本數(shù) 3 個(gè)(配置參數(shù):replication.factor=3

  • Leader Partition 副本:提供對(duì)外讀寫機(jī)制。
  • Follower Partition 副本:同步 Leader 數(shù)據(jù)。

在這里插入圖片描述
副本之間的數(shù)據(jù)同步也可能出現(xiàn)問題:數(shù)據(jù)丟失問題和數(shù)據(jù)不一致問題。

解決方案:ISR 和 Epoch 機(jī)制

  • ISR(In-Sync Replicas) : 當(dāng) Le``ader 宕機(jī),可以從 ISR 中選擇一個(gè) Follower 作為 Leader。

  • Epoch 機(jī)制: 解決 Leader 副本高水位更新和 Follower 副本高水位更新在時(shí)間上是存在錯(cuò)配問題。

Tips: Kafka 0.11.x 版本才引入 leader epoch 機(jī)制解決高水位機(jī)制弊端。

對(duì)應(yīng)需要的配置參數(shù)如下:

1.acks=-1 或者 acks=all: 必須所有副本均同步到消息,才能表明消息發(fā)送成功。

2.replication.factor >= 3: 副本數(shù)至少有 3 個(gè)。

3.min.insync.replicas > 1: 代表消息至少寫入 2個(gè)副本才算發(fā)送成功。前提需要 acks=-1。

舉個(gè)栗子:Leader 宕機(jī)了,至少要保證 ISR 中有一個(gè) Follower,這樣這個(gè)Follwer被選舉為L(zhǎng)eader 且不會(huì)丟失數(shù)據(jù)。
公式:replication.factor = min.insync.replicas + 1

4.unclean.leader.election.enable=false: 防止不在 ISR 中的 Follower 被選舉為 Leader。

Kafka 0.11.0.0版本開始默認(rèn) unclean.leader.election.enable=false

3)消費(fèi)端
消費(fèi)端消息丟失場(chǎng)景有:

1.消息堆積: 幾個(gè)分區(qū)的消息都沒消費(fèi),就跟丟消息一樣。

2.解決措施: 一般問題都出在消費(fèi)端,盡量提高客戶端的消費(fèi)速度,消費(fèi)邏輯另起線程進(jìn)行處理。

3.自動(dòng)提交: 消費(fèi)端拉下一批數(shù)據(jù),正在處理中自動(dòng)提交了 offset,這時(shí)候消費(fèi)端宕機(jī)了; 重啟后,拉到新一批數(shù)據(jù),而上一批數(shù)據(jù)卻沒處理完。

4.解決措施: 取消自動(dòng)提交 auto.commit = false,改為手動(dòng) ack。

5.心跳超時(shí),引發(fā) Rebalance: 客戶端心跳超時(shí),觸發(fā) Rebalance被踢出消費(fèi)組。如果只有這一個(gè)客戶端,那消息就不會(huì)被消費(fèi)了。

同時(shí)避免兩次 poll 的間隔時(shí)間超過閾值:

6.max.poll.records:降低該參數(shù)值,建議遠(yuǎn)遠(yuǎn)小于 <單個(gè)線程每秒消費(fèi)的條數(shù)> * <消費(fèi)線程的個(gè)數(shù)> * <max.poll.interval.ms> 的積。
max.poll.interval.ms: 該值要大于 <max.poll.records> / (<單個(gè)線程每秒消費(fèi)的條數(shù)> * <消費(fèi)線程的個(gè)數(shù)>) 的值。
解決措施: 客戶端版本升級(jí)至 0.10.2 以上版本。

案例:凡凡曾遇到數(shù)據(jù)同步時(shí),消息中的文本需經(jīng)過 NLP 的 NER 分析,再同步到 ES。

這個(gè)過程的主要流程是:

在這里插入圖片描述
1.數(shù)據(jù)同步程序從 Kafka 中拉取消息。
2.數(shù)據(jù)同步程序?qū)⑾?nèi)的文本發(fā)送的 NER 進(jìn)行分析,得到特征數(shù)組。
3.數(shù)據(jù)同步程序?qū)⑾⑼浇o ES。

現(xiàn)象:線上數(shù)據(jù)同步程序運(yùn)行一段時(shí)間后,消息就不消費(fèi)了。

  • 排查日志: 發(fā)現(xiàn)有 Rebalance 日志,懷疑是客戶端消費(fèi)太慢被踢出了消費(fèi)組。
  • 本地測(cè)試: 發(fā)現(xiàn)運(yùn)行一段時(shí)間也會(huì)出現(xiàn) Rebalance,且 NLP的NER 服務(wù)訪問 HTTP 500 報(bào)錯(cuò)。
  • 得出結(jié)論: 因NER服務(wù)異常,導(dǎo)致數(shù)據(jù)同步程序消費(fèi)超時(shí)。且當(dāng)時(shí)客戶端版本為 v0.10.1,Consumer 沒有獨(dú)立線程維持心跳,而是把心跳維持與 poll 接口耦合在一起,從而也會(huì)造成心跳超時(shí)。

當(dāng)時(shí)解決措施是:

1.session.timeout.ms: 設(shè)置為 25s,當(dāng)時(shí)沒有升級(jí)客戶端版本,怕帶來其他問題。
2.熔斷機(jī)制: 增加 Hystrix,超過 3 次服務(wù)調(diào)用異常就熔斷,保護(hù)客戶端正常消費(fèi)數(shù)據(jù)。

3、如何確保消息不丟失?

掌握這些技能:

1.熟悉消息從發(fā)送到消費(fèi)的每個(gè)階段
2.監(jiān)控報(bào)警 Kafka 集群
3.熟悉方案 “MQ 可靠消息投遞”

怎么確保消息 100% 不丟失?
到這,總結(jié)下:

①生產(chǎn)端:

  • 設(shè)置重試:props.put(“retries”, “10”);
  • 設(shè)置 acks=all
  • 設(shè)置回調(diào):producer.send(msg, new CallBack(){…});

②Broker:

  • 內(nèi)存:使用帶蓄電池后備電源的緩存 cache。
  • Kafka 版本 0.11.x 以上:支持 Epoch 機(jī)制。
  • replication.factor >= 3: 副本數(shù)至少有 3 個(gè)。
  • min.insync.replicas > 1: 代表消息至少寫入 2個(gè)副本才算發(fā)送成功。前提需要 acks=-1。
  • unclean.leader.election.enable=false: 防止不在 ISR 中的 Follower 被選舉為 Leader。

③消費(fèi)端

  • 客戶端版本升級(jí)至 0.10.2 以上版本。
  • 取消自動(dòng)提交 auto.commit = false,改為手動(dòng) ack。
  • 盡量提高客戶端的消費(fèi)速度,消費(fèi)邏輯另起線程進(jìn)行處理
http://www.risenshineclean.com/news/54365.html

相關(guān)文章:

  • 在靜安正規(guī)的設(shè)計(jì)公司網(wǎng)站個(gè)人博客登錄入口
  • 卡通網(wǎng)站建設(shè)濟(jì)南頭條新聞熱點(diǎn)
  • 正規(guī)的培訓(xùn)行業(yè)網(wǎng)站開發(fā)seo關(guān)鍵詞如何布局
  • 在中國(guó)做博彩網(wǎng)站違法嗎seo網(wǎng)站優(yōu)化服務(wù)商
  • wap asp網(wǎng)站模板下載淘寶怎樣優(yōu)化關(guān)鍵詞
  • 個(gè)人網(wǎng)站建立教程網(wǎng)站建設(shè)黃頁免費(fèi)觀看
  • 網(wǎng)站建設(shè)最好的公司網(wǎng)站域名費(fèi)一年多少錢
  • 廣州網(wǎng)站優(yōu)化關(guān)鍵詞排名最新疫情新聞100字
  • 長(zhǎng)治制作公司網(wǎng)站的公司百度免費(fèi)推廣怎么操作
  • 可以做來電名片的網(wǎng)站seo高端培訓(xùn)
  • 怎么做網(wǎng)站首頁圖片不會(huì)失真云南今日頭條新聞
  • 內(nèi)容管理系統(tǒng)開源佛山網(wǎng)站建設(shè)十年樂云seo
  • 一個(gè)好的網(wǎng)站應(yīng)該具有什么西安百度推廣競(jìng)價(jià)托管
  • 舉例說明網(wǎng)絡(luò)營(yíng)銷的概念小紅書seo排名帝搜軟件
  • 網(wǎng)站建設(shè)商務(wù)的術(shù)語怎么注冊(cè)網(wǎng)站平臺(tái)
  • wordpress安裝顯示404寧波優(yōu)化網(wǎng)站排名軟件
  • 可信賴的深圳網(wǎng)站建設(shè)百度seo霸屏軟件
  • 門戶網(wǎng)站建設(shè)方案文檔如何自己建立一個(gè)網(wǎng)站
  • 京東商城企業(yè)網(wǎng)站建設(shè)分析收錄網(wǎng)
  • 網(wǎng)站內(nèi)的搜索怎么做的市場(chǎng)調(diào)研問卷
  • 網(wǎng)站標(biāo)題寫什么作用seo顧問服務(wù) 樂云踐新專家
  • 做了個(gè)網(wǎng)站 怎么做seo百度網(wǎng)盤網(wǎng)頁版登錄首頁
  • 空間網(wǎng)站鏈接怎么做淘寶店鋪買賣交易平臺(tái)
  • seo優(yōu)化方案書鄭州seo優(yōu)化推廣
  • 做網(wǎng)站-信科網(wǎng)絡(luò)軟文推廣網(wǎng)
  • 酒店網(wǎng)站素材百度電腦版網(wǎng)頁版入口
  • 建網(wǎng)站哪個(gè)好 優(yōu)幫云優(yōu)化公司結(jié)構(gòu)
  • 網(wǎng)上做網(wǎng)站 干對(duì)縫兒生意廣州seo公司品牌
  • 網(wǎng)站開發(fā)編程的工作方法可以看任何網(wǎng)站的瀏覽器
  • 做網(wǎng)站的網(wǎng)站怎么在網(wǎng)上做廣告宣傳