1. 程式人生 > >kafka全面介紹

kafka全面介紹

轉載請註明出處:kafka全面介紹

簡介-什麼是kafka

kafka 是用於收集多個來源的實時流程資料的分散式訊息釋出訂閱系統,具有水平伸縮,高容錯,速度快等特點。它最初由LinkedIn公司基於獨特的設計實現為一個分散式的提交日誌系統( a distributed commit log),,之後成為Apache專案的一部分。目前已經在成千上萬家公司的生產環境中穩定執行。

官網
https://kafka.apache.org/

Apache kafka是訊息中介軟體的一種,類似於MQ訊息服務。

主要用於系統的解耦和事件的承接,防止事件丟失增強系統的健壯性。

我們用吃飯排隊來理解kafka的作用。

比如我們想去吃小龍坎火鍋,但是人很多。
如果全靠客人自己搶座的話,店子容易被擠爆,而且還會發現很多混亂,甚至出現爭吵打架。
為了能承載更多的客流量,所以店子組織了排隊。
在沒有排隊系統之前,都是口頭喊號,這樣容易導致客流量的丟失。
比如 使用者 想去買瓶水,但是不知道什麼時候輪到自己,然後喊號就過了,那對於火鍋店來說 這個客流量就丟失了。
前面兩種型別的處理方案都是非常脆弱的,容易導致崩潰或者客流量流失,滿意度下降。
所以火鍋店引進了一套排隊系統,裡面會記錄每一個消費者和店子的空座情況,並在使用者的手機上做相應的提醒。
這樣我們就能達到依次處理且客流量不容易丟失的情況。
而kafka的作用就是類似於排隊系統,用於收集 各種互動的事件訊息,讓流程可以順利運轉。

kafka建立背景

Kafka是一個訊息系統,原本開發自LinkedIn,用作LinkedIn的活動流(Activity Stream)和運營資料處理管道(Pipeline)的基礎。現在它已被多家不同型別的公司 作為多種型別的資料管道和訊息系統使用。

活動流資料是幾乎所有站點在對其網站使用情況做報表時都要用到的資料中最常規的部分。活動資料包括頁面訪問量(Page View)、被檢視內容方面的資訊以及搜尋情況等內容。這種資料通常的處理方式是先把各種活動以日誌的形式寫入某種檔案,然後週期性地對這些檔案進行統計分析。運營資料指的是伺服器的效能資料(CPU、IO使用率、請求時間、服務日誌等等資料)。運營資料的統計方法種類繁多。

近年來,活動和運營資料處理已經成為了網站軟體產品特性中一個至關重要的組成部分,這就需要一套稍微更加複雜的基礎設施對其提供支援

Kafka是一種分散式的,基於釋出/訂閱的訊息系統。主要設計目標如下:

以時間複雜度為O(1)的方式提供訊息持久化能力,即使對TB級以上資料也能保證常數時間複雜度的訪問效能。
高吞吐率。即使在非常廉價的商用機器上也能做到單機支援每秒100K條以上訊息的傳輸。
支援Kafka Server間的訊息分割槽,及分散式消費,同時保證每個Partition內的訊息順序傳輸。
同時支援離線資料處理和實時資料處理。
Scale out:支援線上水平擴充套件。

為何使用訊息系統

解耦
在專案啟動之初來預測將來專案會碰到什麼需求,是極其困難的。訊息系統在處理過程中間插入了一個隱含的、基於資料的介面層,兩邊的處理過程都要實現這一介面。這允許你獨立的擴充套件或修改兩邊的處理過程,只要確保它們遵守同樣的介面約束。

冗餘
有些情況下,處理資料的過程會失敗。除非資料被持久化,否則將造成丟失。訊息佇列把資料進行持久化直到它們已經被完全處理,通過這一方式規避了資料丟失風險。許多訊息佇列所採用的"插入-獲取-刪除"正規化中,在把一個訊息從佇列中刪除之前,需要你的處理系統明確的指出該訊息已經被處理完畢,從而確保你的資料被安全的儲存直到你使用完畢。

擴充套件性
因為訊息佇列解耦了你的處理過程,所以增大訊息入隊和處理的頻率是很容易的,只要另外增加處理過程即可。不需要改變程式碼、不需要調節引數。擴充套件就像調大電力按鈕一樣簡單。

靈活性 & 峰值處理能力
在訪問量劇增的情況下,應用仍然需要繼續發揮作用,但是這樣的突發流量並不常見;如果為以能處理這類峰值訪問為標準來投入資源隨時待命無疑是巨大的浪費。使用訊息佇列能夠使關鍵元件頂住突發的訪問壓力,而不會因為突發的超負荷的請求而完全崩潰。

可恢復性
系統的一部分元件失效時,不會影響到整個系統。訊息佇列降低了程序間的耦合度,所以即使一個處理訊息的程序掛掉,加入佇列中的訊息仍然可以在系統恢復後被處理。

順序保證
在大多使用場景下,資料處理的順序都很重要。大部分訊息佇列本來就是排序的,並且能保證資料會按照特定的順序來處理。Kafka保證一個Partition內的訊息的有序性。

緩衝
在任何重要的系統中,都會有需要不同的處理時間的元素。例如,載入一張圖片比應用過濾器花費更少的時間。訊息佇列通過一個緩衝層來幫助任務最高效率的執行———寫入佇列的處理會盡可能的快速。該緩衝有助於控制和優化資料流經過系統的速度。

非同步通訊
很多時候,使用者不想也不需要立即處理訊息。訊息佇列提供了非同步處理機制,允許使用者把一個訊息放入佇列,但並不立即處理它。想向佇列中放入多少訊息就放多少,然後在需要的時候再去處理它們。

特點

Apache Kafka與傳統訊息系統相比,有以下不同:

它被設計為一個分散式系統,易於擴充套件;
它同時為釋出和訂閱提供高吞吐量;
它支援多訂閱者,當失敗時能自動平衡消費者;
它將訊息持久化到磁碟,因此可用於批量消費,例如ETL,以及實時應用程式

常用Message Queue對比

RabbitMQ

RabbitMQ是使用Erlang編寫的一個開源的訊息佇列,本身支援很多的協議:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量級,更適合於企業級的開發。同時實現了Broker構架,這意味著訊息在傳送給客戶端時先在中心佇列排隊。對路由,負載均衡或者資料持久化都有很好的支援。

Redis

Redis是一個基於Key-Value對的NoSQL資料庫,開發維護很活躍。雖然它是一個Key-Value資料庫儲存系統,但它本身支援MQ功能,所以完全可以當做一個輕量級的佇列服務來使用。對於RabbitMQ和Redis的入隊和出隊操作,各執行100萬次,每10萬次記錄一次執行時間。測試資料分為128Bytes、512Bytes、1K和10K四個不同大小的資料。實驗表明:入隊時,當資料比較小時Redis的效能要高於RabbitMQ,而如果資料大小超過了10K,Redis則慢的無法忍受;出隊時,無論資料大小,Redis都表現出非常好的效能,而RabbitMQ的出隊效能則遠低於Redis。

ZeroMQ

ZeroMQ號稱最快的訊息佇列系統,尤其針對大吞吐量的需求場景。ZeroMQ能夠實現RabbitMQ不擅長的高階/複雜的佇列,但是開發人員需要自己組合多種技術框架,技術上的複雜度是對這MQ能夠應用成功的挑戰。ZeroMQ具有一個獨特的非中介軟體的模式,你不需要安裝和執行一個訊息伺服器或中介軟體,因為你的應用程式將扮演這個伺服器角色。你只需要簡單的引用ZeroMQ程式庫,可以使用NuGet安裝,然後你就可以愉快的在應用程式之間傳送訊息了。但是ZeroMQ僅提供非永續性的佇列,也就是說如果宕機,資料將會丟失。其中,Twitter的Storm 0.9.0以前的版本中預設使用ZeroMQ作為資料流的傳輸(Storm從0.9版本開始同時支援ZeroMQ和Netty作為傳輸模組)。

ActiveMQ

ActiveMQ是Apache下的一個子專案。 類似於ZeroMQ,它能夠以代理人和點對點的技術實現佇列。同時類似於RabbitMQ,它少量程式碼就可以高效地實現高階應用場景。

Kafka/Jafka

Kafka是Apache下的一個子專案,是一個高效能跨語言分散式釋出/訂閱訊息佇列系統,而Jafka是在Kafka之上孵化而來的,即Kafka的一個升級版。具有以下特性:快速持久化,可以在O(1)的系統開銷下進行訊息持久化;高吞吐,在一臺普通的伺服器上既可以達到10W/s的吞吐速率;完全的分散式系統,Broker、Producer、Consumer都原生自動支援分散式,自動實現負載均衡;支援Hadoop資料並行載入,對於像Hadoop的一樣的日誌資料和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka通過Hadoop的並行載入機制統一了線上和離線的訊息處理。Apache Kafka相對於ActiveMQ是一個非常輕量級的訊息系統,除了效能非常好之外,還是一個工作良好的分散式系統。

轉載請註明出處:kafka全面介紹

與 Flume 的區別

Kafka 與 Flume 很多功能確實是重複的。以下是評估兩個系統的一些建議:

Kafka 是一個通用型系統。你可以有許多的生產者和消費者分享多個主題。相反地,Flume 被設計成特定用途的工作,特定地向 HDFS 和 HBase 傳送出去。Flume 為了更好地為 HDFS 服務而做了特定的優化,並且與 Hadoop 的安全體系整合在了一起。基於這樣的結論,Hadoop 開發商 Cloudera 推薦如果資料需要被多個應用程式消費的話,推薦使用 Kafka,如果資料只是面向 Hadoop 的,可以使用 Flume。

Flume 擁有許多配置的來源 (sources) 和儲存池 (sinks)。然後,Kafka 擁有的是非常小的生產者和消費者環境體系,Kafka 社群並不是非常支援這樣。如果你的資料來源已經確定,不需要額外的編碼,那你可以使用 Flume 提供的 sources 和 sinks,反之,如果你需要準備自己的生產者和消費者,那你需要使用 Kafka。

Flume 可以在攔截器裡面實時處理資料。這個特性對於過濾資料非常有用。Kafka 需要一個外部系統幫助處理資料。
無論是 Kafka 或是 Flume,兩個系統都可以保證不丟失資料。然後,Flume 不會複製事件。相應地,即使我們正在使用一個可以信賴的檔案通道,如果 Flume agent 所在的這個節點宕機了,你會失去所有的事件訪問能力直到你修復這個受損的節點。使用 Kafka 的管道特性不會有這樣的問題。

Flume 和 Kafka 可以一起工作的。如果你需要把流式資料從 Kafka 轉移到 Hadoop,可以使用 Flume 代理 (agent),將 kafka 當作一個來源 (source),這樣可以從 Kafka 讀取資料到 Hadoop。你不需要去開發自己的消費者,你可以使用 Flume 與 Hadoop、HBase 相結合的特性,使用 Cloudera Manager 平臺監控消費者,並且通過增加過濾器的方式處理資料。

參考文章:
https://www.cloudera.com/documentation/kafka/latest/topics/kafka_flume.html
使用Kafka與Flume

Kafka基本術語

後面大家會看到一些關於kafka的名詞,比如topic、producer、consumer、broker,我這邊來簡單說明一下。

producer:生產者,釋出訊息的物件稱之為話題生產者(Kafka topic producer),比如火鍋店作為生產者釋出座位排號的情況

consumer:消費者,訂閱訊息並處理髮布的訊息的種子的物件稱之為話題消費者(consumers),比如使用者訂閱了火鍋店的座位排號情況

topic:標籤,你把它理解為標籤,生產者每生產一條資訊就貼上一個標籤(topic),比如2人座位,4人座位,6人座位,消費者可以選擇性的訂閱需要知道的訊息,比如我只需要了解2人座位的排號情況。

broker:代理,已釋出的訊息儲存在一組伺服器中,稱之為Kafka叢集。叢集中的每一個伺服器都是一個代理(Broker). 消費者可以訂閱一個或多個話題,並從Broker拉資料,從而消費這些已釋出的訊息。

Partition:分割槽,Partition 是物理上的概念,每個 Topic 包含一個或多個 Partition。

Consumer Group:消費者分組,每個 Consumer 屬於一個特定的 Consumer Group(可為每個 Consumer 指定 group name,若不指定 group name 則屬於預設的 group)。

架構

聽起來和JMS訊息處理差不多

Client和Server之間的交流通過一條簡單、高效能並且不侷限某種開發語言的TCP協議。除了Java Client外,還有非常多的其它程式語言的Client。

拓撲結構

更詳細的情況如上圖所示,一個典型的Kafka叢集中包含若干Producer(可以是web前端產生的Page View,或者是伺服器日誌,系統CPU、Memory等),若干broker(Kafka支援水平擴充套件,一般broker數量越多,叢集吞吐率越高),若干Consumer Group,以及一個Zookeeper叢集。Kafka通過Zookeeper管理叢集配置,選舉leader,以及在Consumer Group發生變化時進行rebalance。Producer使用push模式將訊息釋出到broker,Consumer使用pull模式從broker訂閱並消費訊息。

Topic & Partition

Topic在邏輯上可以被認為是一個queue,每條消費都必須指定它的Topic,可以簡單理解為必須指明把這條訊息放進哪個queue裡。為了使得Kafka的吞吐率可以線性提高,物理上把Topic分成一個或多個Partition,每個Partition在物理上對應一個資料夾,該資料夾下儲存這個Partition的所有訊息和索引檔案。本文所用叢集共8個節點,此處topic1和topic2 replication-factor均為1。若建立topic1和topic2兩個topic,且分別有13個和19個分割槽,則整個叢集上會相應會生成共32個資料夾,如下圖所示。

每個日誌檔案都是一個log entrie序列,每個log entrie包含一個4位元組整型數值(值為N+5),1個位元組的"magic value",4個位元組的CRC校驗碼,其後跟N個位元組的訊息體。每條訊息都有一個當前Partition下唯一的64位元組的offset,它指明瞭這條訊息的起始位置。磁碟上儲存的訊息格式如下:

message length : 4 bytes (value: 1+4+n)
"magic" value : 1 byte 
crc : 4 bytes 
payload : n bytes 

這個log entries並非由一個檔案構成,而是分成多個segment,每個segment以該segment第一條訊息的offset命名並以“.kafka”為字尾。另外會有一個索引檔案,它標明瞭每個segment下包含的log entry的offset範圍,如下圖所示。

因為每條訊息都被append到該Partition中,屬於順序寫磁碟,因此效率非常高(經驗證,順序寫磁碟效率比隨機寫記憶體還要高,這是Kafka高吞吐率的一個很重要的保證)。

對於傳統的message queue而言,一般會刪除已經被消費的訊息,而Kafka叢集會保留所有的訊息,無論其被消費與否。當然,因為磁碟限制,不可能永久保留所有資料(實際上也沒必要),因此Kafka提供兩種策略刪除舊資料。一是基於時間,二是基於Partition檔案大小。例如可以通過配置$KAFKA_HOME/config/server.properties,讓Kafka刪除一週前的資料,也可在Partition檔案超過1GB時刪除舊資料,配置如下所示。

# The minimum age of a log file to be eligible for deletion
log.retention.hours=168
# The maximum size of a log segment file. When this size is reached a new log segment will be created.
log.segment.bytes=1073741824
# The interval at which log segments are checked to see if they can be deleted according to the retention policies
log.retention.check.interval.ms=300000
# If log.cleaner.enable=true is set the cleaner will be enabled and individual logs can then be marked for log compaction.
log.cleaner.enable=false

這裡要注意,因為Kafka讀取特定訊息的時間複雜度為O(1),即與檔案大小無關,所以這裡刪除過期檔案與提高Kafka效能無關。選擇怎樣的刪除策略只與磁碟以及具體的需求有關。另外,Kafka會為每一個Consumer Group保留一些metadata資訊——當前消費的訊息的position,也即offset。這個offset由Consumer控制。正常情況下Consumer會在消費完一條訊息後遞增該offset。當然,Consumer也可將offset設成一個較小的值,重新消費一些訊息。因為offet由Consumer控制,所以Kafka broker是無狀態的,它不需要標記哪些訊息被哪些消費過,也不需要通過broker去保證同一個Consumer Group只有一個Consumer能消費某一條訊息,因此也就不需要鎖機制,這也為Kafka的高吞吐率提供了有力保障。

Producer訊息路由

Producer傳送訊息到broker時,會根據Paritition機制選擇將其儲存到哪一個Partition。如果Partition機制設定合理,所有訊息可以均勻分佈到不同的Partition裡,這樣就實現了負載均衡。如果一個Topic對應一個檔案,那這個檔案所在的機器I/O將會成為這個Topic的效能瓶頸,而有了Partition後,不同的訊息可以並行寫入不同broker的不同Partition裡,極大的提高了吞吐率。可以在$KAFKA_HOME/config/server.properties中通過配置項num.partitions來指定新建Topic的預設Partition數量,也可在建立Topic時通過引數指定,同時也可以在Topic建立之後通過Kafka提供的工具修改。

在傳送一條訊息時,可以指定這條訊息的key,Producer根據這個key和Partition機制來判斷應該將這條訊息傳送到哪個Parition。Paritition機制可以通過指定Producer的paritition.class這一引數來指定,該class必須實現kafka.producer.Partitioner介面。本例中如果key可以被解析為整數則將對應的整數與Partition總數取餘,該訊息會被髮送到該數對應的Partition。(每個Parition都會有個序號,序號從0開始)

import kafka.producer.Partitioner;
import kafka.utils.VerifiableProperties;

public class JasonPartitioner<T> implements Partitioner {

    public JasonPartitioner(VerifiableProperties verifiableProperties) {}

    @Override
    public int partition(Object key, int numPartitions) {
        try {
            int partitionNum = Integer.parseInt((String) key);
            return Math.abs(Integer.parseInt((String) key) % numPartitions);
        } catch (Exception e) {
            return Math.abs(key.hashCode() % numPartitions);
        }
    }
}

如果將上例中的類作為partition.class,並通過如下程式碼傳送20條訊息(key分別為0,1,2,3)至topic3(包含4個Partition)。

public void sendMessage() throws InterruptedException{
  for(int i = 1; i <= 5; i++){
        List messageList = new ArrayList<KeyedMessage<String, String>>();
        for(int j = 0; j < 4; j++){
            messageList.add(new KeyedMessage<String, String>("topic2", j+"", "The " + i + " message for key " + j));
        }
        producer.send(messageList);
    }
  producer.close();
}

則key相同的訊息會被髮送並存儲到同一個partition裡,而且key的序號正好和Partition序號相同。(Partition序號從0開始,本例中的key也從0開始)。下圖所示是通過Java程式呼叫Consumer後打印出的訊息列表。

##Consumer Group

(本節所有描述都是基於Consumer hight level API而非low level API)。

使用Consumer high level API時,同一Topic的一條訊息只能被同一個Consumer Group內的一個Consumer消費,但多個Consumer Group可同時消費這一訊息。

這是Kafka用來實現一個Topic訊息的廣播(發給所有的Consumer)和單播(發給某一個Consumer)的手段。一個Topic可以對應多個Consumer Group。如果需要實現廣播,只要每個Consumer有一個獨立的Group就可以了。要實現單播只要所有的Consumer在同一個Group裡。用Consumer Group還可以將Consumer進行自由的分組而不需要多次傳送訊息到不同的Topic。

實際上,Kafka的設計理念之一就是同時提供離線處理和實時處理。根據這一特性,可以使用Storm這種實時流處理系統對訊息進行實時線上處理,同時使用Hadoop這種批處理系統進行離線處理,還可以同時將資料實時備份到另一個數據中心,只需要保證這三個操作所使用的Consumer屬於不同的Consumer Group即可。下圖是Kafka在Linkedin的一種簡化部署示意圖。

下面這個例子更清晰地展示了Kafka Consumer Group的特性。首先建立一個Topic (名為topic1,包含3個Partition),然後建立一個屬於group1的Consumer例項,並建立三個屬於group2的Consumer例項,最後通過Producer向topic1傳送key分別為1,2,3的訊息。結果發現屬於group1的Consumer收到了所有的這三條訊息,同時group2中的3個Consumer分別收到了key為1,2,3的訊息。如下圖所示。

Push vs. Pull

作為一個訊息系統,Kafka遵循了傳統的方式,選擇由Producer向broker push訊息並由Consumer從broker pull訊息。一些logging-centric system,比如Facebook的Scribe和Cloudera的Flume,採用push模式。事實上,push模式和pull模式各有優劣。

push模式很難適應消費速率不同的消費者,因為訊息傳送速率是由broker決定的。push模式的目標是儘可能以最快速度傳遞訊息,但是這樣很容易造成Consumer來不及處理訊息,典型的表現就是拒絕服務以及網路擁塞。而pull模式則可以根據Consumer的消費能力以適當的速率消費訊息。

對於Kafka而言,pull模式更合適。pull模式可簡化broker的設計,Consumer可自主控制消費訊息的速率,同時Consumer可以自己控制消費方式——即可批量消費也可逐條消費,同時還能選擇不同的提交方式從而實現不同的傳輸語義。

Kafka delivery guarantee

有這麼幾種可能的delivery guarantee:

At most once 訊息可能會丟,但絕不會重複傳輸
At least one 訊息絕不會丟,但可能會重複傳輸
Exactly once 每條訊息肯定會被傳輸一次且僅傳輸一次,很多時候這是使用者所想要的。

當Producer向broker傳送訊息時,一旦這條訊息被commit,因數replication的存在,它就不會丟。但是如果Producer傳送資料給broker後,遇到網路問題而造成通訊中斷,那Producer就無法判斷該條訊息是否已經commit。雖然Kafka無法確定網路故障期間發生了什麼,但是Producer可以生成一種類似於主鍵的東西,發生故障時冪等性的重試多次,這樣就做到了Exactly once。截止到Kafka 0.10版本,這一Feature還並未實現。

接下來討論的是訊息從broker到Consumer的delivery guarantee語義。(僅針對Kafka consumer high level API)。Consumer在從broker讀取訊息後,可以選擇commit,該操作會在Zookeeper中儲存該Consumer在該Partition中讀取的訊息的offset。該Consumer下一次再讀該Partition時會從下一條開始讀取。如未commit,下一次讀取的開始位置會跟上一次commit之後的開始位置相同。當然可以將Consumer設定為autocommit,即Consumer一旦讀到資料立即自動commit。如果只討論這一讀取訊息的過程,那Kafka是確保了Exactly once。但實際使用中應用程式並非在Consumer讀取完資料就結束了,而是要進行進一步處理,而資料處理與commit的順序在很大程度上決定了訊息從broker和consumer的delivery guarantee semantic。

讀完訊息先commit再處理訊息。這種模式下,如果Consumer在commit後還沒來得及處理訊息就crash了,下次重新開始工作後就無法讀到剛剛已提交而未處理的訊息,這就對應於At most once

讀完訊息先處理再commit。這種模式下,如果在處理完訊息之後commit之前Consumer crash了,下次重新開始工作時還會處理剛剛未commit的訊息,實際上該訊息已經被處理過了。這就對應於At least once。在很多使用場景下,訊息都有一個主鍵,所以訊息的處理往往具有冪等性,即多次處理這一條訊息跟只處理一次是等效的,那就可以認為是Exactly once。(筆者認為這種說法比較牽強,畢竟它不是Kafka本身提供的機制,主鍵本身也並不能完全保證操作的冪等性。而且實際上我們說delivery guarantee 語義是討論被處理多少次,而非處理結果怎樣,因為處理方式多種多樣,我們不應該把處理過程的特性——如是否冪等性,當成Kafka本身的Feature)

如果一定要做到Exactly once,就需要協調offset和實際操作的輸出。精典的做法是引入兩階段提交。如果能讓offset和操作輸入存在同一個地方,會更簡潔和通用。這種方式可能更好,因為許多輸出系統可能不支援兩階段提交。比如,Consumer拿到資料後可能把資料放到HDFS,如果把最新的offset和資料本身一起寫到HDFS,那就可以保證資料的輸出和offset的更新要麼都完成,要麼都不完成,間接實現Exactly once。(目前就high level API而言,offset是存於Zookeeper中的,無法存於HDFS,而low level API的offset是由自己去維護的,可以將之存於HDFS中)

總之,老版本的Kafka預設保證At least once,並且允許通過設定Producer非同步提交來實現At most once。而Exactly once要求與外部儲存系統協作,幸運的是Kafka提供的offset可以非常直接非常容易得使用這種方式。

具備新的里程碑意義的功能的Kafka 0.11.x版本(對應 Confluent Platform 3.3)引入了exactly-once語義。
詳見
Kafka 0.11.0.0 是如何實現 Exactly-once 語義的
https://www.confluent.io/blog/exactly-once-semantics-are-possible-heres-how-apache-kafka-does-it/
Kafka設計解析(八)- Exactly Once語義與事務機制原理

常見應用場景

一、訊息系統, 例如ActiveMQ 和 RabbitMQ.
二、站點的使用者活動追蹤。 用來記錄使用者的頁面瀏覽,搜尋,點選等。
三、操作審計。 使用者/管理員的網站操作的監控。
四、日誌聚合。收集資料,集中處理。
五、流處理。
六、[Event sourcing] (http://martinfowler.com/eaaDev/EventSourcing.html)
七、Commit Log

結束語

綜上所述,Kafka 的設計可以幫助我們解決很多架構上的問題。但是想要用好 Kafka 的高效能、低耦合、高可靠性、資料不丟失等特性,我們需要非常瞭解 Kafka,以及我們自身的應用系統使用場景,並不是任何環境 Kafka 都是最佳選擇。

轉載請註明出處:kafka全面介紹

參考文章:
Kafka剖析(一):Kafka背景及架構介紹
Kafka快速入門

轉載請註明出處:kafka全面介紹