1. apache kafka有哪幾個部分組成
Kafka是一個分布式發布-訂閱publish-subscribe消息傳遞系統,設計目標是快速、可伸縮和耐用冗餘。
它是一個在一個較高的抽象水平上描述的但是又非常簡單的系統,雖然當你更深地挖掘時會令人難以置信的技術細節。卡夫卡文檔出色的解釋了系統中許多設計和實現的微妙之處,所以我們不會在這里試圖解釋他們了。
像許多發布-訂閱消息傳遞系統,卡夫卡能保存源消息的數據。生產者將輸入寫入到主題topic,而消費者則從主題topic中讀取寫入數據。因為卡夫卡是一個分布式系統,所以topic主題會實現跨多個節點分區和復制。
消息是簡單byte數組,開發者能夠使用它們存在對象的任何格式,如String或JSON和Avro,每個消息能夠有一個Key,因此,生產者保證擁有相同key的消息到達同一個分區,而對主題topic的消費,可以使用多個消費者來配置消費組,每個消費組中消費者能夠從他訂閱的那個主題Topic所在分區子集中讀取消息,這樣每個消息發送給消費組中一個消費者,使用相同key的所有消息能夠到達相同的消費者。
Kafka的特點是它將每個主題topic分區都看成一個日誌log(一個有順序的消息集合),一個分區中的每個消息被分配一個唯一的偏移量offset.
Kafka並不試圖跟蹤哪個消息被哪個消費者讀取,而是只是保留未被讀取的消息。
Kafka保留所有消息的時間,而消費者負責跟蹤它們在每個日誌(日誌是一個消息序列集合代表一個topic分區)中的位置,
因此Kafka能夠支持大量的消費者,使用最小的代價保留大量的數據。
Kafka如何工作?
假設我們正在開發一個大型多人在線游戲。在這些游戲中,玩家在一個虛擬的世界中互相合作和競爭。通常玩家互相發生貿易,比如交換物品和金錢,所以游戲開發者重要的是要確保球員不會欺騙,在下面兩種情況下的交易將標記為特殊:如果貿易數量明顯大於正常的球員;如果IP玩家登錄是不同於過去的20場比賽使用的IP。除了對實時交易進行標記以外,我們也想載入數據到Apache
Hadoop,我們的數據,科學家們可以用它來訓練和測試新演算法。
基於游戲伺服器內存數據緩存進行實時事件標記是最好的,能夠讓我們達到迅速決定,特別是對那些最活躍玩家。如果我們分區游戲伺服器,我們的系統有多個游戲伺服器和數據集,,包括過去登錄的20個玩家和近20在內存的交易,。
我們的游戲伺服器必須執行兩個截然不同的角色:第一個是接受和執行用戶操作,第二是實時處理貿易信息並標記可疑事件。為了有效執行第二個角色功能,每個用戶整個貿易的歷史事件都駐留在一個單獨的伺服器內存中。因為接收用戶操作(第一個角色功能)的伺服器可能沒有他的貿易歷史,這意味著我們必須通過伺服器之間的消息實現第二個角色功能。為了讓兩個角色功能保持鬆散耦合,我們使用卡夫卡在伺服器之間傳遞消息,您將看到如下:
卡夫卡有幾個特性:
可伸縮性、數據分區,低延遲,並且能夠處理大量不同的消費者。我們為登錄和交易配置了一個Topic主題。我們把它們配置成一個topic主題的原因是:只有我們獲得已經登錄信息(我們可以確保玩家從他平時IP登錄)後,才能確保他的交易是有效的。卡夫卡可以在在一個主題topic中維護這個前後順序,而不是在兩個topic之間。
當用戶登錄後進行交易,接受伺服器立即發送事件到Kafka. 消息是將user id作為key, 事件作為值.
這能確保同一個用戶的所有交易和登錄發送到Kafka同樣的分區. 每個事件處理伺服器都運行一個Kafka消費者,
其每個消費者都被配置為同樣組的一部分,這樣,每個伺服器從少量Kafka分區讀取消息,所有關於某個特定用戶的數據都能發往相同事件處理伺服器,當事件處理伺服器從Kafka讀取一個用戶交易時,將這個事件加入到用戶事件歷史緩存本地內存緩存,這樣就無需額外網路磁碟開銷直接標記那些可以事件。
重要的是我們為每個事件處理伺服器創建一個分區,或者每個事件處理伺服器上每核對應一個多線程應用,(記住 Kafka大部分是用少於 10,000
個分區實現所有主題topic,這樣我們不能為每個用戶創建一個分區,因為用戶數是不斷增加的。)
這好像是一種迂迴方式處理事件:從游戲伺服器發送事件到Kafka,
另外一台伺服器讀取這個事件再處理它,這種設計解耦了兩種角色功能,允許我們為每個角色功能安排其需要的容量與能力。.另外,這樣做不會增加處理時間,因為Kafka是設計為高吞吐量和低延遲的,即使只有一個小的三台節點伺服器的集群環境,也能每秒處理接近一百萬個事件,平均延遲只有3ms.
當伺服器標識出一個事件作為可疑,它會發送這個標記了的事件到新的Kafka
topic,比如其主題名稱為Alerts,這時報警伺服器或儀表監控伺服器會接受到這個事件,同時另外一個單獨過程會從Alerts主題中讀取這個事件,將它寫入到Hadoop進行更進一步分析。
因為Kafka並不跟蹤確認每個消費者的消息,它就能用很少的性能影響處理成千上萬的消費者。Kafka甚至可以處理批量消費者:每一個小時處理過程喚醒激活處理一個隊列中所有消息,根本就不會影響系統的吞吐量或延遲。