1. 程式人生 > >Kafka訊息可靠性

Kafka訊息可靠性

如果MQ沒有類似資料庫事務結構和保證,是不可能達到訊息投遞100%可靠的,極端情況下訊息投遞要麼丟失或重複。

下面咋們從producer,broker,consumer的角度分析一下Kafka中會出現哪些情況。

1.Producer傳送訊息到Broker


目前生產者傳送訊息(request.required.acks)有三種方式。

acks = 0: producer不會等待broker傳送ack ,因為傳送訊息網路超時或broker crash (1.Partition的Leader還沒有commit訊息 2.Leader與Follower資料不同步),既有可能丟失也可能會重發。

acks = 1

: 當leader接收到訊息之後傳送ack,丟會重發,丟的概率很小。

acks = -1: 當所有的follower都同步訊息成功後傳送ack.  丟失訊息可能性比較低。

2.Consumer從Broker拉取訊息


Kafka中有兩種consumer介面,分別為Low-level API和High-levelAPI

(1). Low-level API  SimpleConsumer

這套介面比較複雜的,使用者必須要考慮很多事情,優點就是對Kafka可以有完全的控制。

(2).  High-level API ZookeeperConsumerConnector

High-level API使用比較簡單,已經封裝了對partition和offset的管理,預設是會定期自動commit offset,這樣可能會丟資料的,因為consumer可能拿到資料沒有處理完crash。 High-level API介面的特點,自動管理,使用簡單,但是對Kafka的控制不夠靈活。

3. Broker儲存訊息

    (1).  對於broker,落盤的資料,除非磁碟壞了,一般不會丟的。

    (2).  對於記憶體髒(沒有flush磁碟)資料,broker重啟會丟。
        可以通過log.flush.interval.messages和log.flush.interval.ms來配置flush間隔,interval大丟的資料多些,小會影響效能。
        但在0.8.x版本以後,可以通過replication機制保證資料不丟,代價就是需要更多資源,尤其是磁碟資源,kafka當前支援GZIP和Snappy壓縮,來緩解這個問題。 
        是否使用replication

取決於在可靠性和資源代價之間的平衡。

總結

Kafka只是能保證at-least once訊息語義,即資料是可能重複的,這個在應用上需要可以容忍。
對於Kafka consumer,一般情況下推薦使用high-level API介面,最好不要直接使用low-level API,自己寫起來比較麻煩和困難。

相關推薦

Kafka訊息可靠性

如果MQ沒有類似資料庫事務結構和保證,是不可能達到訊息投遞100%可靠的,極端情況下訊息投遞要麼丟失或重複。 下面咋們從producer,broker,consumer的角度分析一下Kafka中會出現哪些情況。 1.Producer傳送訊息到Broker 目前生

Kafka訊息delivery可靠性保證(Message Delivery Semantics)

原文見:http://kafka.apache.org/documentation.html#semanticskafka在生產者和消費者之間的傳輸是如何保證的,我們可以知道有這麼幾種可能提供的deli

高效能kafka訊息可靠性分析及常見問題

    kfaka發訊息的模式分為同步和非同步,預設是同步的,非同步的吞吐量比較高,但是訊息丟失的概率比較大,同步還是非同步可以通過producer.type屬性進行控制    kafka有三種訊息確認機制,由request.required.acks屬性控制,acks=0時

訊息佇列Kafka可靠性原理深度解讀上篇

1 概述 Kakfa起初是由LinkedIn公司開發的一個分散式的訊息系統,後成為Apache的一部分,它使用Scala編寫,以可水平擴充套件和高吞吐率而被廣泛使用。目前越來越多的開源分散式處理系統如Cloudera、Apache Storm、Spark等都支援與Kafka整合。 Kafka憑藉著自身

springboot kafka整合(包括java程式碼不能傳送和消費kafka訊息的採坑記錄)

kafka採坑記錄:     1、kafka服務端server.properties中的broker.id叢集內需要唯一。     2、kafka config檔案中listeners和advertised.listeners需要配置本機ip:9092

KOA + egg.js 整合 kafka 訊息佇列

Egg.js : 基於KOA2的企業級框架 Kafka:高吞吐量的分散式釋出訂閱訊息系統 本文章將整合egg + kafka + mysql 的日誌系統例子 系統要求:日誌記錄,通過kafka進行訊息佇列控制 思路圖: 這裡消費者和生產者都由日誌系統提供 λ.1 環境準備 ①Ka

Kafka訊息順序保證

Kafka可以保證同一個分割槽裡的訊息是有序的。生產者按照一定的順序傳送訊息,broker會按照這個順序將訊息寫入分割槽的批次快取中,消費者也會按照同樣的順序讀取它們。 如果把retries設定為非零整數,同時把max.in.flight.requests.per.connection設定為大於

Kafka訊息保留策略

Kafka Broker預設的訊息保留策略是:要麼保留一定時間,要麼保留到訊息達到一定大小的位元組數。 當訊息達到設定的條件上限時,舊訊息就會過期並被刪除,所以,在任何時刻,可用訊息的總量都不會超過配置引數所指定的大小。 topic可以配置自己的保留策略,可以將訊息保留到不再使用他們為止。

kafka 訊息格式設計實現

目前kafka訊息格式有三個版本(假定v0,v1,v2),0.10.0之前使用的是v0版本,之後慢慢演變出v1,v2,後兩個版本在設計方式上沒有什麼特別大的區別,只是做了些空間上的優化,同樣的訊息,新版本的使用儲存空間會更小,優化主要在於訊息頭部的壓縮,當然還有些功能上的優化,例如添加了

Kafka整體結構圖 Consumer與topic關係 Kafka訊息分發 Consumer的負載均衡 Kafka檔案存

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

使用PHP處理Kafka訊息

Kafka 是一種高吞吐的分散式訊息系統,能夠替代傳統的訊息佇列用於解耦合資料處理,快取未處理訊息等,同時具有更高的吞吐率,支援分割槽、多副本、冗餘,因此被廣泛用於大規模訊息資料處理應用。 Kafka的特點: 以時間複雜度為O(1)的方式提供訊息持久化能力,即使對TB級以

Kafka訊息佇列介紹、環境搭建及應用:C#實現消費者-生產者訂閱

一:kafka介紹 kafka(官網地址:http://kafka.apache.org)是一種高吞吐量的分散式釋出訂閱的訊息佇列系統,具有高效能和高吞吐率。 1.1 術語介紹 Broker Kafka叢集包含一個或多個伺服器,這種伺服器被稱為broker

二、kafka訊息與同步機制

如上圖所示:Producer根據指定的partition方法(預設round-robin、hash等),將訊息釋出到指定topic的partition裡面;kafka叢集接收到Producer發過來的訊息後,將其持久化到硬碟,並保留訊息指定時長(可配置),而不關注訊息是否被消費;Consume

Kafka- 訊息佇列中【點對點】與【釋出訂閱】區別

1.JMS中定義 JMS規範目前支援兩種訊息模型:點對點(point to point, queue)和釋出/訂閱(publish/subscribe,topic)。 點對點: 訊息生產者生產訊息傳送到queue中,然後訊息消費者從queue中取出並且消費訊息。這裡要注意: 訊息被消費以

Kafka Broker可靠性

Broker有3個配置引數會影響Kafka訊息儲存的可靠性。這3個引數可以應用在Broker級別,控制所有主題的行為,也可以應用在主題級別,用於控制個別主題的行為。 1.複製係數 主題級別的配置引數是replication.factor,而Broker級別可以通過default.replic

flink叢集一鍵安裝指令碼 -- kafka訊息中介軟體依賴zookeeper叢集安裝指令碼

#!/bin/sh INSTALL_PATH="/usr/local/src/"; ZOOKEEPER_VERSION="3.4.11" ZOOKEEPER_GZIP="zookeeper-${ZOOKEEPER_VERSION}.tar.gz"; ZOOKEEPER_CONF_DIR

Kafka工作流程-KafkaCluster和Kafka可靠性儲存

1.KafkaCluster     在使用 Kafka 低階消費者時,可以通過 KafkaCluster 類實現 offset 向 ZooKeeper 的提交 和獲取。     Kafka 協議非常簡單,只有六個核心客戶端請求 API:         元資料(Met

使用kafka訊息佇列解決分散式事務(可靠訊息最終一致性方案-本地訊息服務)

微服務框架Spring Cloud介紹 Part1: 使用事件和訊息佇列實現分散式事務 本文轉自:http://skaka.me/blog/2016/04/21/springcloud1/ 不同於單一架構應用(Monolith), 分散式環境下, 進行事務操作將變得困難,

Kafka訊息序列化和反序列化(上)

Kafka Producer在傳送訊息時必須配置的引數為:bootstrap.servers、key.serializer、value.serializer。序列化操作是在攔截器(Interceptor)執行之後並且在分配分割槽(partitions)之前執行的。 首先我們

KClient——kafka訊息中介軟體原始碼解讀

目錄 最近在拜讀李豔鵬的《可伸縮服務架構——框架與中介軟體》,該篇隨筆,針對第二章的KClient(kafka訊息中介軟體)原始碼解讀專案,進行學習。 kclient訊息中介軟體 從使用角度上開始入手學習 kclient-processor 該專案使用springboot呼叫kclient庫,程式目錄如下: