來源:OSC開源社區(qū)(ID:oschina2013)Flink(ID:Apache_Flink)Apache Kafka 是一個分布式開源流平臺,被廣泛應(yīng)用于各大互聯(lián)網(wǎng)公司。Kafka 設(shè)計之初被用于消息隊列,自 2011 年由 LinkedIn 開源以來,Kafka 迅速從消息隊列演變?yōu)槌墒斓氖录魈幚砥脚_。Kafka 具有四個核心 API,借助這些 API,Kafka 可以用于以下兩大類應(yīng)用:
- 建立實時流數(shù)據(jù)管道,可靠地進行數(shù)據(jù)傳輸,在系統(tǒng)或應(yīng)用程序之間獲取數(shù)據(jù)。
- 構(gòu)建實時流媒體應(yīng)用程序,以改變系統(tǒng)或應(yīng)用程序之間的數(shù)據(jù)或?qū)?shù)據(jù)流做出反應(yīng)。
例如:
- 已棄用對 Java 8 和 Scala 2.12 的支持,對它們的支持將在 4.0 版本中徹底移除,以讓開發(fā)者有時間進行調(diào)整。
- Kafka Raft 支持元數(shù)據(jù)主題的快照,以及 self-managed quorum 方面的其他改進。
- 廢棄了消息格式 v0 和 v1。
- 默認情況下為 Kafka Producer 啟用更強的交付保證。
- 優(yōu)化了 OffsetFetch 和 FindCoordinator 請求。
- 更靈活的 MirrorMaker 2 配置和 MirrorMaker 1 的棄用。
- 能夠在 Kafka Connect 的一次調(diào)用中重新啟動連接器的任務(wù)。
- 連接器日志上下文和連接器客戶端覆蓋現(xiàn)在是默認啟用的。
- 增強了 Kafka Streams 中時間戳同步的語義。
- 修改了 Stream 的 TaskId 的公共 API。
- 在 Kafka Streams 中,默認的 serde 變成了 null,還有一些其他的配置變化。
接下來,我們來看看新版本具體在哪些地方進行了更新。根據(jù)官方資料介紹,Apache Kafka 3.0 引入了各種新功能、突破性的 API 更改以及對 KRaft 的改進——Apache Kafka 的內(nèi)置共識機制將取代 Apache ZooKeeper?。雖然 KRaft 尚未被推薦用于生產(chǎn)(已知差距列表),但對 KRaft 元數(shù)據(jù)和 API 進行了許多改進。Exactly-once 和分區(qū)重新分配支持值得強調(diào)。鼓勵大家查看 KRaft 的新功能并在開發(fā)環(huán)境中試用它。從 Apache Kafka 3.0 開始,生產(chǎn)者默認啟用最強的交付保證(acks=all, enable.idempotence=true)。這意味著用戶現(xiàn)在默認獲得排序和持久性。此外,不要錯過 Kafka Connect 任務(wù)重啟增強、KStreams 基于時間戳同步的改進以及 MirrorMaker2 更靈活的配置選項。
| 常規(guī)變化
KIP-750(第一部分):棄用 Kafka 中對 Java 8 的支持
在 3.0 中,Apache Kafka 項目的所有組件都已棄用對 Java 8 的支持。這將使用戶有時間在下一個主要版本(4.0)之前進行調(diào)整,屆時 Java 8 支持將被取消。
KIP-751(第一部分):棄用 Kafka 中對 Scala 2.12 的支持
對 Scala 2.12 的支持在 Apache Kafka 3.0 中也已棄用。與 Java 8 一樣,我們給用戶時間來適應(yīng),因為計劃在下一個主要版本(4.0)中刪除對 Scala 2.12 的支持。
| Kafka 代理、生產(chǎn)者、消費者和管理客戶端KIP-630:Kafka Raft 快照
我們在 3.0 中引入的一個主要功能是 KRaft 控制器和 KRaft 代理能夠為名為 __cluster_metadata 的元數(shù)據(jù)主題分區(qū)生成、復(fù)制和加載快照。Kafka 集群使用此主題來存儲和復(fù)制有關(guān)集群的元數(shù)據(jù)信息,如代理配置、主題分區(qū)分配、領(lǐng)導(dǎo)等。隨著此狀態(tài)的增長,Kafka Raft Snapshot 提供了一種有效的方式來存儲、加載和復(fù)制此信息。
KIP-746:修改 KRaft 元數(shù)據(jù)記錄
自第一版 Kafka Raft 控制器以來的經(jīng)驗和持續(xù)開發(fā)表明,需要修改一些元數(shù)據(jù)記錄類型,當(dāng) Kafka 被配置為在沒有 ZooKeeper(ZK)的情況下運行時使用這些記錄類型。
KIP-730:KRaft 模式下的生產(chǎn)者 ID 生成
在 3.0 和 KIP-730 中,Kafka 控制器現(xiàn)在完全接管了生成 Kafka 生產(chǎn)者 ID 的責(zé)任。控制器在 ZK 和 KRaft 模式下都這樣做。這讓我們更接近橋接版本,這將允許用戶從使用 ZK 的 Kafka 部署過渡到使用 KRaft 的新部署。
KIP-679:Producer 將默認啟用最強的交付保證
從 3.0 開始,Kafka 生產(chǎn)者默認開啟冪等性和所有副本的交付確認。這使得默認情況下記錄交付保證更強。
KIP-735:增加默認消費者會話超時
Kafka Consumer 配置屬性的默認值 session.timeout.ms 從 10 秒增加到 45 秒。這將允許消費者在默認情況下更好地適應(yīng)暫時的網(wǎng)絡(luò)故障,并在消費者似乎只是暫時離開組時避免連續(xù)重新平衡。
KIP-709:擴展 OffsetFetch 請求以接受多個組 ID
請求 Kafka 消費者組的當(dāng)前偏移量已經(jīng)有一段時間了。但是獲取多個消費者組的偏移量需要對每個組進行單獨的請求。在 3.0 和 KIP-709 中,fetch 和 AdminClient API 被擴展為支持在單個請求/響應(yīng)中同時讀取多個消費者組的偏移量。
KIP-699:更新 FindCoordinator 以一次解析多個 Coordinator
支持可以以有效方式同時應(yīng)用于多個消費者組的操作在很大程度上取決于客戶端有效發(fā)現(xiàn)這些組的協(xié)調(diào)者的能力。這通過 KIP-699 成為可能,它增加了對通過一個請求發(fā)現(xiàn)多個組的協(xié)調(diào)器的支持。Kafka 客戶端已更新為在與支持此請求的新 Kafka 代理交談時使用此優(yōu)化。
KIP-724:刪除對消息格式 v0 和 v1 的支持
自 2017 年 6 月隨 Kafka 0.11.0 推出四年以來,消息格式 v2 一直是默認消息格式。因此,在橋下流過足夠多的水(或溪流)后,3.0 的主要版本為我們提供了棄用舊消息格式(即 v0 和 v1)的好機會。這些格式今天很少使用。在 3.0 中,如果用戶將代理配置為使用消息格式 v0 或 v1,他們將收到警告。此選項將在 Kafka 4.0 中刪除(有關(guān)詳細信息和棄用 v0 和 v1 消息格式的影響,請參閱 KIP-724)。
KIP-707:KafkaFuture 的未來
當(dāng) KafkaFuture 引入該類型以促進 Kafka AdminClient 的實現(xiàn)時,Java 8 之前的版本仍在廣泛使用,并且 Kafka 正式支持 Java 7。快進幾年后,現(xiàn)在 Kafka 運行在支持CompletionStage和 CompletableFuture 類類型的 Java 版本上。使用 KIP-707,KafkaFuture 添加了一種返回 CompletionStage 對象的方法,并以 KafkaFuture 向后兼容的方式增強了可用性。
KIP-466:添加對 List序列化和反序列化的支持
KIP-466為泛型列表的序列化和反序列化添加了新的類和方法——這一特性對 Kafka 客戶端和 Kafka Streams 都非常有用。
KIP-734:改進 AdminClient.listOffsets 以返回時間戳和具有最大時間戳的記錄的偏移量
用戶列出 Kafka 主題/分區(qū)偏移量的功能已得到擴展。使用 KIP-734,用戶現(xiàn)在可以要求 AdminClient 返回主題/分區(qū)中具有最高時間戳的記錄的偏移量和時間戳。這是不是與什么的 AdminClient 收益已經(jīng)為最新的偏移,這是下一個記錄的偏移,在主題/分區(qū)寫入混淆。這個擴展現(xiàn)有 ListOffsets API 允許用戶探測生動活潑的通過詢問哪個是最近寫入的記錄的偏移量以及它的時間戳是什么來分區(qū)。
| Kafka ConnectKIP-745:連接 API 以重新啟動連接器和任務(wù)
在 Kafka Connect 中,連接器在運行時表示為一組Connector類實例和一個或多個Task類實例,并且通過 Connect REST API 可用的連接器上的大多數(shù)操作都可以應(yīng)用于整個組。從一開始,一個值得注意的例外 restart 是 Connector 和 Task 實例的端點。要重新啟動整個連接器,用戶必須單獨調(diào)用以重新啟動連接器實例和任務(wù)實例。在 3.0 中,KIP-745 使用戶能夠通過一次調(diào)用重新啟動所有或僅失敗的連接器 Connector 和 Task 實例。此功能是附加功能,restartREST API 的先前行為保持不變。
KIP-738:刪除 Connect 的內(nèi)部轉(zhuǎn)換器屬性
在之前的主版本(Apache Kafka 2.0)中棄用它們之后,internal.key.converter 并 internal.value.converter 在 Connect 工作器的配置中作為配置屬性和前綴被刪除。展望未來,內(nèi)部 Connect 主題將專門使用 JsonConverter 來存儲沒有嵌入模式的記錄。任何使用不同轉(zhuǎn)換器的現(xiàn)有 Connect 集群都必須將其內(nèi)部主題移植到新格式(有關(guān)升級路徑的詳細信息,請參閱 KIP-738)。
KIP-722:默認啟用連接器客戶端覆蓋
從 Apache Kafka 2.3.0 開始,可以配置連接器工作器以允許連接器配置覆蓋連接器使用的 Kafka 客戶端屬性。這是一個廣泛使用的功能,現(xiàn)在有機會發(fā)布一個主要版本,默認啟用覆蓋連接器客戶端屬性的功能(默認 connector.client.config.override.policy 設(shè)置為 All)。
KIP-721:在連接 Log4j 配置中啟用連接器日志上下文
另一個在 2.3.0 中引入但到目前為止尚未默認啟用的功能是連接器日志上下文。這在 3.0 中發(fā)生了變化,連接器上下文默認添加 log4j 到 Connect 工作器的日志模式中。從以前的版本升級到 3.0 將 log4j 通過在適當(dāng)?shù)那闆r下添加連接器上下文來更改導(dǎo)出的日志行的格式。
| Kafka Streams
KIP-695:進一步改進 Kafka Streams 時間戳同步
KIP-695 增強了 Streams 任務(wù)如何選擇獲取記錄的語義,并擴展了配置屬性的含義和可用值 max.task.idle.ms。此更改需要 Kafka 消費者 API 中的一種新方法,currentLag 如果本地已知且無需聯(lián)系 Kafka Broker,則能夠返回特定分區(qū)的消費者滯后。
KIP-715:在流中公開提交的偏移量
3.0 開始,三個新的方法添加到 TaskMetadata 接口:committedOffsets,endOffsets 和 timeCurrentIdlingStarted。這些方法可以允許 Streams 應(yīng)用程序跟蹤其任務(wù)的進度和運行狀況。
KIP-740:清理公共 API TaskId
KIP-740 代表了 TaskId 該類的重大革新。有幾種方法和所有內(nèi)部字段已被棄用,新的 subtopology() 和 partition() 干將替換舊 topicGroupId 和 partition 字段(參見 KIP-744 的相關(guān)變化和修正 KIP-740)。
KIP-744:遷移 TaskMetadata,并 ThreadMetadata 與內(nèi)部實現(xiàn)的接口
KIP-744 將 KIP-740 提出的更改更進一步,并將實現(xiàn)與許多類的公共 API 分開。為了實現(xiàn)這一點,引入了新的接口 TaskMetadata、ThreadMetadata 和 StreamsMetadata,而棄用了具有相同名稱的現(xiàn)有類。
KIP-666:添加 Instant 基于方法到 ReadOnlySessionStore
交互式查詢 API 擴展了 ReadOnlySessionStore 和 SessionStore 接口中的一組新方法,這些方法接受 Instant 數(shù)據(jù)類型的參數(shù)。此更改將影響需要實現(xiàn)新方法的任何自定義只讀交互式查詢會話存儲實現(xiàn)。
KIP-622:添加 currentSystemTimeMs 和 currentStreamTimeMs 到 ProcessorContext
該 ProcessorContext 增加在 3.0 兩個新的方法,currentSystemTimeMs 和 currentStreamTimeMs。新方法使用戶能夠分別查詢緩存的系統(tǒng)時間和流時間,并且可以在生產(chǎn)和測試代碼中以統(tǒng)一的方式使用它們。
KIP-743:刪除 0.10.0-2.4Streams 內(nèi)置指標(biāo)版本配置的配置值
3.0 中取消了對 Streams 中內(nèi)置指標(biāo)的舊指標(biāo)結(jié)構(gòu)的支持。KIP-743 正在 0.10.0-2.4 從配置屬性中刪除該值 built.in.metrics.version。這 latest 是目前此屬性的唯一有效值(自 2.5 以來一直是默認值)。
KIP-741:將默認 SerDe 更改為 null
刪除了默認 SerDe 屬性的先前默認值。流過去默認為 ByteArraySerde。用 3.0 開始,沒有缺省,和用戶需要任一組其的 SerDes 根據(jù)需要在 API 中或通過設(shè)置默認 DEFAULT_KEY_SERDE_CLASS_CONFIG 和 DEFAULT_VALUE_SERDE_CLASS_CONFIG 在它們的流配置。先前的默認值幾乎總是不適用于實際應(yīng)用程序,并且造成的混亂多于方便。
KIP-733:更改 Kafka Streams 默認復(fù)制因子配置
有了主要版本的機會,Streams 配置屬性的默認值replication.factor會從 1 更改為 -1。這將允許新的 Streams 應(yīng)用程序使用在 Kafka 代理中定義的默認復(fù)制因子,因此在它們轉(zhuǎn)移到生產(chǎn)時不需要設(shè)置此配置值。請注意,新的默認值需要 Kafka Brokers 2.5 或更高版本。
KIP-732:棄用 eos-alpha 并用 eos-v2 替換 eos-beta
在 3.0 中不推薦使用的另一個 Streams 配置值是 exactly_once 作為屬性的值 processing.guarantee。該值 exactly_once 對應(yīng)于 Exactly Once Semantics (EOS) 的原始實現(xiàn),可用于連接到 Kafka 集群版本 0.11.0 或更高版本的任何 Streams 應(yīng)用程序。此 EOS 的第一實現(xiàn)已經(jīng)通過流第二實施 EOS 的,這是由值表示取代 exactly_once_beta 在 processing.guarantee 性質(zhì)。展望未來,該名稱 exactly_once_beta 也已棄用并替換為新名稱 exactly_once_v2。在下一個主要版本(4.0)中,exactly_once 和 exactly_once_beta 都將被刪除,exactly_once_v2 作為 EOS 交付保證的唯一選項。
KIP-725:優(yōu)化 WindowedSerializer 和 WindowedDeserializer 的配置
配置屬性 default.windowed.key.serde.inner 和 default.windowed.value.serde.inner 已棄用。取而代之的是 windowed.inner.class.serde 供消費者客戶端使用的單個新屬性。建議 Kafka Streams 用戶通過將其傳遞到 SerDe 構(gòu)造函數(shù)來配置他們的窗口化 SerDe,然后在拓撲中使用它的任何地方提供 SerDe。
KIP-633:棄用 Streams 中寬限期的 24 小時默認值
在 Kafka Streams 中,允許窗口操作根據(jù)稱為寬限期的配置屬性處理窗口外的記錄。以前,這個配置是可選的,很容易錯過,導(dǎo)致默認為 24 小時。這是 Suppression 運營商用戶經(jīng)常感到困惑的原因,因為它會緩沖記錄直到寬限期結(jié)束,因此會增加 24 小時的延遲。在 3.0 中,Windows 類通過工廠方法得到增強,這些工廠方法要求它們使用自定義寬限期或根本沒有寬限期來構(gòu)造。已棄用默認寬限期為 24 小時的舊工廠方法,以及與 grace() 已設(shè)置此配置的新工廠方法不兼容的相應(yīng) API。
KIP-623:internal-topics 為流應(yīng)用程序重置工具添加“ ”選項
通過 kafka-streams-application-reset 添加新的命令行參數(shù),應(yīng)用程序重置工具的 Streams 使用變得更加靈活:--internal-topics。新參數(shù)接受逗號分隔的主題名稱列表,這些名稱對應(yīng)于可以使用此應(yīng)用程序工具安排刪除的內(nèi)部主題。將此新參數(shù)與現(xiàn)有參數(shù)相結(jié)合,--dry-run 允許用戶在實際執(zhí)行刪除操作之前確認將刪除哪些主題并在必要時指定它們的子集。
| MirrorMaker
KIP-720:棄用 MirrorMaker v1
在 3.0 中,不推薦使用 MirrorMaker 的第一個版本。展望未來,新功能的開發(fā)和重大改進將集中在 MirrorMaker 2(MM2)上。
KIP-716:允許使用 MirrorMaker2 配置偏移同步主題的位置
在 3.0 中,用戶現(xiàn)在可以配置 MirrorMaker2 創(chuàng)建和存儲用于轉(zhuǎn)換消費者組偏移量的內(nèi)部主題的位置。這將允許 MirrorMaker2 的用戶將源 Kafka 集群維護為嚴格只讀的集群,并使用不同的 Kafka 集群來存儲偏移記錄(即目標(biāo) Kafka 集群,甚至是源和目標(biāo)集群之外的第三個集群)。Apache Kafka 3.0 是 Apache Kafka 項目向前邁出的重要一步。