1. 程式人生 > 遊戲 >《消逝的光芒2》開場23分鐘實機演示視訊欣賞

《消逝的光芒2》開場23分鐘實機演示視訊欣賞

簡介

主要應用場景是:日誌收集系統和訊息系統。

Kafka主要設計目標如下:

  • 以時間複雜度為O(1)的方式提供訊息持久化能力,即使對TB級以上資料也能保證常數時間的訪問效能。

  • 高吞吐率。即使在非常廉價的商用機器上也能做到單機支援每秒100K條訊息的傳輸。

  • 支援Kafka Server間的訊息分割槽,及分散式消費,同時保證每個partition內的訊息順序傳輸。

  • 同時支援離線資料處理和實時資料處理。

  • Scale out:支援線上水平擴充套件

分散式訊息傳遞基於可靠的訊息佇列,在客戶端應用和訊息系統之間非同步傳遞訊息。有兩種主要的訊息傳遞模式:點對點傳遞模式、釋出-訂閱模式。大部分的訊息系統選用釋出-訂閱模式。Kafka就是一種釋出-訂閱模式

  • 點對點傳遞模式

在點對點訊息系統中,訊息持久化到一個佇列中。此時,將有一個或多個消費者消費佇列中的資料。但是一條訊息只能被消費一次。當一個消費者消費了佇列中的某條資料之後,該條資料則從訊息佇列中刪除。該模式即使有多個消費者同時消費資料,也能保證資料處理的順序。生產者傳送一條訊息到queue,只有一個消費者能收到

  • 釋出訂閱模式

在釋出-訂閱訊息系統中,訊息被持久化到一個topic中。與點對點訊息系統不同的是,消費者可以訂閱一個或多個topic,消費者可以消費該topic中所有的資料,同一條資料可以被多個消費者消費,資料被消費後不會立馬刪除。在釋出-訂閱訊息系統中,訊息的生產者稱為釋出者,消費者稱為訂閱者。釋出者傳送到topic的訊息,只有訂閱了topic的訂閱者才會收到訊息

優點

  • 解耦

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

  • 冗餘(副本)

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

  • 擴充套件性

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

  • 靈活性&峰值處理能力

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

  • 可恢復性

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

  • 順序保證

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

  • 緩衝

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

  • 非同步通訊

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

  • 其他優點

    • 訊息系統: Kafka 和傳統的訊息系統(也稱作訊息中介軟體)都具備系統解耦、冗餘儲存、流量削峰、緩衝、非同步通訊、擴充套件性、可恢復性等功能。與此同時,Kafka 還提供了大多數訊息系統難以實現的訊息順序性保障及回溯消費的功能。

    • 儲存系統: Kafka 把訊息持久化到磁碟,相比於其他基於記憶體儲存的系統而言,有效地降低了資料丟失的風險。也正是得益於 Kafka 的訊息持久化功能和多副本機制,我們可以把 Kafka 作為長期的資料儲存系統來使用,只需要把對應的資料保留策略設定為“永久”或啟用主題的日誌壓縮功能即可。

    • 流式處理平臺: Kafka 不僅為每個流行的流式處理框架提供了可靠的資料來源,還提供了一個完整的流式處理類庫,比如視窗、連線、變換和聚合等各類操作。

常用MQ對比

  • RabbitMQ

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

  • Redis

雖然它是一個Key-Value資料庫儲存系統,但它本身支援MQ功能,所以完全可以當做一個輕量級的佇列服務來使用。

  • Kafka/Jafka

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

術語

下圖展示了Kafka的相關術語以及之間的關係:

上圖中一個topic配置了3個partition。Partition1有兩個offset:0和1。Partition2有4個offset。Partition3有1個offset。副本的id和副本所在的機器的id恰好相同。

如果一個topic的副本數為3,那麼Kafka將在叢集中為每個partition建立3個相同的副本。叢集中的每個broker儲存一個或多個partition。多個producer和consumer可同時生產和消費資料。

  • broker

Kafka 叢集包含一個或多個伺服器,伺服器節點稱為broker。

broker儲存topic的資料。如果某topic有N個partition,叢集有N個broker,那麼每個broker儲存該topic的一個partition。

如果某topic有N個partition,叢集有(N+M)個broker,那麼其中有N個broker儲存該topic的一個partition,剩下的M個broker不儲存該topic的partition資料。

如果某topic有N個partition,叢集中broker數目少於N個,那麼一個broker儲存該topic的一個或多個partition。在實際生產環境中,儘量避免這種情況的發生,這種情況容易導致Kafka叢集資料不均衡。

  • Topic

每條釋出到Kafka叢集的訊息都有一個類別,這個類別被稱為Topic。(物理上不同Topic的訊息分開儲存,邏輯上一個Topic的訊息雖然保存於一個或多個broker上,但使用者只需指定訊息的Topic即可生產或消費資料而不必關心資料存於何處)類似於資料庫的表名

  • Partition

topic中的資料分割為一個或多個partition。每個topic至少有一個partition。每個partition中的資料使用多個segment檔案儲存(segment檔案在broker中)。partition中的資料是有序的,不同partition間的資料丟失了資料的順序。如果topic有多個partition,消費資料時就不能保證資料的順序。在需要嚴格保證訊息的消費順序的場景下,需要將partition數目設為1。

  • Producer

生產者即資料的釋出者,該角色將訊息釋出到Kafka的topic中。broker接收到生產者傳送的訊息後,broker將該訊息追加到當前用於追加資料的segment檔案中。生產者傳送的訊息,儲存到一個partition中,生產者也可以指定資料儲存的partition。

  • Consumer

消費者可以從broker中讀取資料。消費者可以消費多個topic中的資料。

  • Consumer Group

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

  • Leader

每個partition有多個副本,其中有且僅有一個作為Leader,Leader是當前負責資料的讀寫的partition。

可以認為是master/slave模式,每一個partition都是一個主從模式的架構。對外提供服務的主:leader。 為了高可用搞的節點冗餘

  • Follower

Follower跟隨Leader,所有寫請求都通過Leader路由,資料變更會廣播給所有Follower,Follower與Leader保持資料同步。如果Leader失效,則從Follower中選舉出一個新的Leader。當Follower與Leader掛掉、卡住或者同步太慢,leader會把這個follower從“in sync replicas”(ISR)列表中刪除,重新建立一個Follower。