1. 程式人生 > 其它 >為什麼kafka和zk總是在一起?

為什麼kafka和zk總是在一起?

一.概念

釋出訂閱,一個釋出者釋出到訊息,所有訂閱者都可以接收到
生產消費,一個訊息物件只能被一個消費者消費
kafka是生產者,zookeeper是消費者

有3個微服務,聚合形成一個統一的業務層
但是每個微服務都需要互相知道對方的服務地址。這樣每個微服務地址修改,其他微服務的配置檔案都需要修改,這樣就是耦合的。

解耦就是服務註冊中心,統一管理所有的微服務資訊
每個微服務呼叫介面,統一從服務註冊中心獲取,這樣每個微服務地址修改,只需要向註冊中心報備,其他微服務什麼都不用改,這樣就是解耦的。

那麼有個角色就是“服務註冊中心”,這個可以用 Zookeeper、Eureka、Consul 作為實現方案

二.例子

zk是用於訊息列隊的,分散式,調節各個程式之間的通訊和操作

例如一個網站 註冊分幾部
1.使用者點選註冊,網站發請求到後端伺服器
2.後端伺服器收到後,給使用者發個郵件
3.使用者點選郵件進行驗證,證明是他本人
4.將這個使用者新增到資料中

這一套下來使用者才算註冊了,才能正常登陸,但有幾個問題:
1.使用者如果當前不方便驗證郵件,那就沒法註冊了,顯然不合理
2.當這個程式的資料庫地址變動了,就需要在程式碼裡修改,讓程式知道最新的資料庫地址,這樣會很麻煩
3.這顯然不合理

就引出了訊息列隊的作用 就是非同步操作 程式收到請求 直接跳過2和3 先寫到資料庫 讓使用者可以登入 後面再發郵件 這是非同步的 非同步就是訊息列隊

也就是使用者可以登入後 過段時間在驗證郵件 不然超過24小時或者一些時間 不驗證就禁止登入 如此

那就需要多個程式來完成這個任務 就是分散式 A程式負責接收請求 寫到資料庫 B程式負責發郵件 驗證郵件,如果超時不驗證 告訴A程式禁止賬號

那你可以選擇搞一個C程式 協調這2 一個註冊請求進來 呼叫A註冊 再呼叫B進行發郵件啥的

zk就是這個C程式 他將請求進行拆分 放到一個箱子裡 箱子1號位置是使用者1的註冊請求,2號位置是使用者3的郵件請求, zk依次將這些請求發到對應的小程式裡

因為是非同步的 所以不著急 就好像同時3使用者註冊 使用者A點選註冊了,可能10分鐘後驗證郵件才發過來

kafka是一個籃子 將這些請求裝進去 然後依次交給zk zk將註冊請求給A程式,驗證請求給B程式

如果請求太多 籃子放不下 就堵塞了 就需要加kafka, 如果zk解決不過來了 那又堵塞了 就要加zk

kafka是生產者 他儲存請求 zk是消費者 對請求進行處理

zk也是冗餘作用的 比如A程式可以有10個 他做負載均衡 也做備份 當A1程式掛了 就把請求給A2

zk是中轉站 他將各種請求非同步的給各種其它程式 但要求是非同步的請求

如果是比較嚴格的 例如打錢給別人 多個程式驗證 就得同步 非同步會出問題

Pro push訊息到broker裡面,然後會記錄一個資訊,(類似儲存位置),給zk記錄起來,然後consum消費時候先去zk裡問他要資料儲存的節點和位置。

取到資訊返回,zk在這裡面起到通訊作用,broker是kafka的儲存,zk執行事物時候一般先把訊息給leader,然後leader去推送,comsuer取訊息時候是pull。

本文版權歸作者所有,歡迎轉載,請務必新增原文連結。