Apache Kafka 3.0.0 穩(wěn)定版發(fā)布,有哪些值得關(guān)心的變化?
點(diǎn)擊上方 "大數(shù)據(jù)肌肉猿"關(guān)注, 星標(biāo)一起成長(zhǎng)
后臺(tái)回復(fù)【加群】,進(jìn)入高質(zhì)量學(xué)習(xí)交流群
2021年大數(shù)據(jù)肌肉猿公眾號(hào)獎(jiǎng)勵(lì)制度

Apache Kafka 3.0 于2021年9月21日正式發(fā)布。本文將介紹這個(gè)版本的新功能。以下文章翻譯自 《What's New in Apache Kafka 3.0.0》。
我很高興地代表 Apache Kafka? 社區(qū)宣布 Apache Kafka 3.0 的發(fā)布。Apache Kafka 3.0 是一個(gè)大版本,其引入了各種新功能、API 發(fā)生重大變化以及對(duì) KRaft 的改進(jìn)—— Apache Kafka 的內(nèi)置共識(shí)機(jī)制將取代 Apache ZooKeeper?。
雖然 KRaft 還不推薦在生產(chǎn)中使用,但我們對(duì) KRaft 元數(shù)據(jù)和 API 進(jìn)行了許多改進(jìn)。支持 Exactly-once 和分區(qū)重分配值得強(qiáng)調(diào)。我們推薦您查看 KRaft 的新功能并在開(kāi)發(fā)環(huán)境中試用它。
從 Apache Kafka 3.0 開(kāi)始,Producer 默認(rèn)啟用最強(qiáng)的交付保證(acks=all,enable.idempotence=true)。這意味著默認(rèn)情況下消息將有序并且持久性。
此外,不要錯(cuò)過(guò) Kafka Connect 任務(wù)重啟增強(qiáng)、Kafka Streams 基于時(shí)間戳同步的改進(jìn)以及 MirrorMaker2 更靈活的配置選項(xiàng)。
要完整的特性和功能增強(qiáng),可以到 release notes 里面了解。您還可以觀看發(fā)布視頻,了解 Apache Kafka 3.0.0 中新增功能的簡(jiǎn)要介紹。
普通變化
KIP-750 (Part I): Deprecate support for Java 8 in Kafka
Apache Kafka 項(xiàng)目的所有組件在 3.0 中都將 Java 8 標(biāo)記為 deprecated。這給用戶(hù)足夠的時(shí)間在下一個(gè)主要版本(4.0)之前進(jìn)行調(diào)整,那時(shí)候 4.0 將不再支持 Java 8。
KIP-751 (Part I): Deprecate support for Scala 2.12 in Kafka
Apache Kafka 項(xiàng)目的所有組件在 3.0 中都將 Scala 2.12 標(biāo)記為 deprecated。這給用戶(hù)足夠的時(shí)間在下一個(gè)主要版本(4.0)之前進(jìn)行調(diào)整,那時(shí)候 4.0 將不再支持 Scala 2.12。
Kafka Broker, Producer, Consumer 和 AdminClient 方面的改進(jìn)
KIP-630: Kafka Raft Snapshot
我們?cè)?3.0 中引入的一個(gè)主要功能是 KRaft Controllers 和 KRaft Brokers,能夠?yàn)樵獢?shù)據(jù)主題 __cluster_metadata 的分區(qū)生成、復(fù)制和加載快照。Kafka 集群使用這個(gè)主題來(lái)存儲(chǔ)和復(fù)制有關(guān)集群的元數(shù)據(jù)信息,例如 Broker 配置、topic 分區(qū)分配、leadership 等。隨著此狀態(tài)的增長(zhǎng),Kafka Raft Snapshot 提供了一種有效的方式來(lái)存儲(chǔ)、加載和復(fù)制(replicate)這些信息 .
KIP-746: Revise KRaft Metadata Records
Kafka Raft Controller 第一版的經(jīng)驗(yàn)和持續(xù)開(kāi)發(fā)表明,我們需要修改一些元數(shù)據(jù)記錄類(lèi)型(metadata record types),這些元數(shù)據(jù)記錄類(lèi)型在 Kafka 配置不使用 ZooKeeper 的時(shí)候需要使用。
KIP-730: Producer ID generation in KRaft mode
在 KIP-730 中,Kafka Controller 現(xiàn)在完全接管生成 Kafka Producer ID 的功能。Controller 在 ZK 和 KRaft 模式下都是這么做的。這讓我們離橋式發(fā)布( bridge release)更近了一步,這將允許用戶(hù)從使用 ZK 的 Kafka 部署過(guò)渡到使用 KRaft 的新部署。
KIP-679: Producer will enable the strongest delivery guarantee by default
從 3.0 開(kāi)始,Kafka Producer 默認(rèn)打開(kāi)冪等性(enable.idempotence=true)以及所有副本的交付都需要確認(rèn)(acks=all)。這使得默認(rèn)情況下記錄的交付更加可靠。
KIP-735: Increase default consumer session timeout
Kafka Consumer 的配置屬性 session.timeout.ms 的默認(rèn)值從 10 秒增加到 45 秒。這將允許消費(fèi)者在默認(rèn)情況下更好地適應(yīng)暫時(shí)的網(wǎng)絡(luò)故障,并避免當(dāng)消費(fèi)者只是暫時(shí)離開(kāi)組時(shí)的連續(xù)重新平衡(consecutive rebalances)。
KIP-709: Extend OffsetFetch requests to accept multiple group ids
支持請(qǐng)求 Kafka 消費(fèi)者組的當(dāng)前偏移量的功能已經(jīng)存在一段時(shí)間了。但是獲取多個(gè)消費(fèi)者組的偏移量需要對(duì)每個(gè)組進(jìn)行單獨(dú)的請(qǐng)求。在 KIP-709 中,fetch 和 AdminClient API 被擴(kuò)展為支持在單個(gè)請(qǐng)求/響應(yīng)中同時(shí)讀取多個(gè)消費(fèi)者組的偏移量。
KIP-699: Update FindCoordinator to resolve multiple Coordinators at a time
支持能夠同時(shí)高效地應(yīng)用于多個(gè)消費(fèi)者組的操作,在很大程度上取決于客戶(hù)有效地發(fā)現(xiàn)這些組的協(xié)調(diào)者的能力。這可以通過(guò) KIP-699 實(shí)現(xiàn),它增加了對(duì)通過(guò)一個(gè)請(qǐng)求發(fā)現(xiàn)多個(gè)組的協(xié)調(diào)器的支持。Kafka 客戶(hù)端已經(jīng)更新在與新的支持此請(qǐng)求的 Kafka broker 交互時(shí)使用此優(yōu)化。
KIP-724: Drop support for message formats v0 and v1
自 2017 年 6 月隨 Kafka 0.11.0 推出四年以來(lái),消息格式 v2 一直是默認(rèn)消息格式。因此,由于已經(jīng)有足夠多的場(chǎng)景使用這個(gè)格式,3.0 的主要發(fā)行版為我們提供了一個(gè)很好的機(jī)會(huì)來(lái)?xiàng)売门f的消息格式——即 v0 和 v1,這些格式現(xiàn)在很少使用。在 3.0 中,如果用戶(hù)將 Broker 配置為使用消息格式 v0 或 v1,則會(huì)收到警告。這個(gè)選項(xiàng)將在 Kafka 4.0 中被移除(有關(guān)v0和v1消息格式的棄用的細(xì)節(jié)和含義,請(qǐng)參閱 KIP-724)。
KIP-707: The future of KafkaFuture
當(dāng) KafkaFuture 類(lèi)型被引入以方便 Kafka AdminClient 的實(shí)現(xiàn)時(shí),Java 8 之前的版本仍在廣泛使用,并且 Kafka 正式支持 Java 7。幾年后,Kafka 運(yùn)行在支持 CompletionStage 和 CompletableFuture 類(lèi)類(lèi)型的 Java 版本上。通過(guò) KIP-707,KafkaFuture 增加了一個(gè)方法來(lái)返回 CompletionStage 對(duì)象,以向后兼容的方式增強(qiáng)了 KafkaFuture 的可用性。
KIP-466: Add support for List serialization and deserialization
KIP-466 為 generic lists 的序列化和反序列化添加了新的類(lèi)和方法——這一特性對(duì) Kafka 客戶(hù)端和 Kafka Streams 都非常有用。
KIP-734: Improve AdminClient.listOffsets to return timestamp and offset for the record with the largest timestamp
用戶(hù)列出 Kafka 主題/分區(qū)偏移量的能力已得到擴(kuò)展。使用 KIP-734,用戶(hù)現(xiàn)在可以要求 AdminClient 返回 topic/分區(qū)中具有最高時(shí)間戳的記錄的偏移量和時(shí)間戳。(不要將此與 AdminClient 已經(jīng)返回的最新偏移量混淆,后者是要寫(xiě)入 topic/分區(qū)中的下一個(gè)記錄的偏移量。) 對(duì)現(xiàn)有 ListOffsets API 的這個(gè)擴(kuò)展允許用戶(hù)通過(guò)詢(xún)問(wèn)最近寫(xiě)入的記錄的偏移量以及它的時(shí)間戳來(lái)探測(cè)分區(qū)的活躍度。
Kafka Connect
KIP-745: Connect API to restart connector and tasks
在 Kafka Connect 中,connector 在運(yùn)行時(shí)被表示為一組 Connector 類(lèi)實(shí)例和一個(gè)或多個(gè) Task 類(lèi)實(shí)例,通過(guò) Connect REST API 對(duì) connectors 的大多數(shù)操作都可以應(yīng)用到整個(gè)組中。一個(gè)值得注意的例外是 Connector 和 Task 實(shí)例的重啟端點(diǎn)(restart endpoints)。要重新啟動(dòng)整個(gè)連接器,用戶(hù)必須單獨(dú)調(diào)用以重新啟動(dòng)連接器實(shí)例和任務(wù)實(shí)例。在 3.0 中,KIP-745 使用戶(hù)能夠通過(guò)一次調(diào)用重新啟動(dòng)所有或僅失敗的連接器的 Connector 和 Task 實(shí)例。此功能是一項(xiàng)附加功能,重啟 REST API 的先前行為保持不變。
KIP-738: Removal of Connect's internal converter properties
在之前的主要版本(Apache Kafka 2.0)中棄用之后,internal.key.converter 和 internal.value.converter 作為配置屬性和前綴在 Connect worker 的配置中被刪除。接下來(lái),內(nèi)部 Connect 主題將專(zhuān)門(mén)使用 JsonConverter 來(lái)存儲(chǔ)沒(méi)有嵌入模式的記錄。任何使用不同轉(zhuǎn)換器的現(xiàn)有 Connect 集群都必須將其內(nèi)部主題移植到新格式(有關(guān)升級(jí)路徑的詳細(xì)信息,請(qǐng)參閱 KIP-738)。
KIP-722: Enable connector client overrides by default
從 Apache Kafka 2.3.0 開(kāi)始,Connect worker 可以配置為允許連接器配置覆蓋連接器使用的 Kafka 客戶(hù)端屬性。這是一個(gè)廣泛使用的特性,現(xiàn)在隨著主要版本的發(fā)布,默認(rèn)情況下啟用了覆蓋連接器客戶(hù)端屬性的功能(connector.client.config.override.policy 默認(rèn)為 All)。
KIP-721: Enable connector log contexts in Connect Log4j configuration
另一個(gè)在 2.3.0 中引入但到目前為止尚未默認(rèn)啟用的功能是連接器日志上下文(connector log contexts)。這在 3.0 中發(fā)生了變化,連接器上下文默認(rèn)添加到 Connect 工作器的 log4j 日志 pattern 中。從以前的版本升級(jí)到 3.0 將通過(guò)添加連接器上下文來(lái)更改log4j導(dǎo)出的日志行格式。
Kafka Streams
KIP-695: Further improve Kafka Streams timestamp synchronization
KIP-695 增強(qiáng)了 Streams 任務(wù)如何選擇獲取記錄的語(yǔ)義,并擴(kuò)展了配置屬性 max.task.idle.ms 的含義和可用值。此更改需要 Kafka Consumer API 中名為 currentLag 的新方法;如果本地已知,它能夠返回一個(gè)特定分區(qū)的消費(fèi)者延遲,并且不需要和 Kafka Broker 交互。
KIP-715: Expose committed offset in streams
從 3.0 開(kāi)始,TaskMetadata 接口增加了三個(gè)新方法:committedOffsets、endOffsets 和 timeCurrentIdlingStarted。這些方法允許 Streams 應(yīng)用程序跟蹤任務(wù)的進(jìn)度和運(yùn)行狀況。
KIP-740: Clean up public API in TaskId
KIP-740 中對(duì) TaskId 類(lèi)進(jìn)行了重大更新。一些方法和所有內(nèi)部字段都已棄用,新的 subtopology() 和 partition() getters 將取代舊的 topicGroupId 和分區(qū)字段(另請(qǐng)參閱 KIP-744 以了解相關(guān)更改和對(duì) KIP-740 的修正)。
KIP-744: Migrate TaskMetadata and ThreadMetadata to an interface with internal implementation
KIP-744 對(duì) KIP-740 中提出的更改做了進(jìn)一步修改,并將實(shí)現(xiàn)與許多類(lèi)的公共 API 分開(kāi)。為了實(shí)現(xiàn)這一點(diǎn),引入了新的接口 TaskMetadata、ThreadMetadata 和 StreamsMetadata,同時(shí)棄用了具有相同名稱(chēng)的現(xiàn)有類(lèi)。
KIP-666: Add Instant-based methods to ReadOnlySessionStore
交互式查詢(xún) API 使用 ReadOnlySessionStore 和 SessionStore 接口中的一組新方法進(jìn)行了擴(kuò)展,這些方法接受 Instant 數(shù)據(jù)類(lèi)型的參數(shù)。此更改將影響需要實(shí)現(xiàn)新方法的任何自定義只讀交互式查詢(xún)會(huì)話存儲(chǔ)實(shí)現(xiàn)。
KIP-622: Add currentSystemTimeMs and currentStreamTimeMs to ProcessorContext
ProcessorContext 在 3.0 中新增了兩個(gè)新方法:currentSystemTimeMs 和 currentStreamTimeMs。新方法使用戶(hù)能夠分別查詢(xún)緩存的系統(tǒng)時(shí)間和流時(shí)間(streams time),并且可以在生產(chǎn)和測(cè)試代碼中以統(tǒng)一的方式使用它們。
KIP-743: Remove config value 0.10.0-2.4 of Streams built-in metrics version config
3.0 中取消了對(duì) Streams 內(nèi)置指標(biāo)中遺留指標(biāo)結(jié)構(gòu)(legacy metrics structure)的支持。KIP-743 正在從配置屬性 built.in.metrics.version 中刪除 0.10.0-2.4 的值。這使得 latest 成為該屬性目前唯一有效值(從2.5開(kāi)始就是默認(rèn)值)。
KIP-741: Change default SerDe to be null
刪除了默認(rèn) SerDe 屬性之前的默認(rèn)值,Streams 之前的默認(rèn)值為 ByteArraySerde。從 3.0 開(kāi)始,沒(méi)有默認(rèn)值,并且用戶(hù)需要在 API 中根據(jù)需要設(shè)置他們的 SerDe,或者在其 Streams 配置中通過(guò) DEFAULT_KEY_SERDE_CLASS_CONFIG 和 DEFAULT_VALUE_SERDE_CLASS_CONFIG 設(shè)置默認(rèn)值。先前的默認(rèn)值幾乎總是不適用于實(shí)際應(yīng)用程序,造成更多的混亂而不是方便。。
KIP-733: Change Kafka Streams default replication factor config
隨著主要版本的發(fā)布,Streams 配置屬性 replication.factor 的默認(rèn)值從 1 更改為 -1。這將允許新的 Streams 應(yīng)用使用在 Kafka Broker 中定義的默認(rèn)復(fù)制因子,因此當(dāng)它們遷移到生產(chǎn)環(huán)境時(shí),不需要設(shè)置這個(gè)配置值。注意,新的默認(rèn)值需要 Kafka Brokers 2.5 或更高版本。
KIP-732: Deprecate eos-alpha and replace eos-beta with eos-v2
另一個(gè)在 3.0 中被棄用的 Streams 配置值是 exactly_once 作為 processing.guarantee 屬性的值。exacly_once 值對(duì)應(yīng)的是精確一次語(yǔ)義(Exactly Once Semantics,EOS)的原始實(shí)現(xiàn),任何連接到 Kafka 集群版本 0.11.0 或更新版本的 Streams 應(yīng)用程序都可以使用。EOS 的第一個(gè)實(shí)現(xiàn)已經(jīng)被 Streams 中的EOS 的第二個(gè)實(shí)現(xiàn)所取代,后者由 processing.guarantee 屬性中的 exact_once_beta 配置表示。接下來(lái),名稱(chēng) exactly_once_beta 也被棄用,并被新的 exactly_once_v2 取代。在下一個(gè)主要版本(4.0)中,exacly_once 和 exacly_once_beta 都將被刪除,僅留下 exacly_once_v2 作為 EOS 交付保證的唯一選項(xiàng)。
KIP-725: Streamlining configurations for WindowedSerializer and WindowedDeserializer
配置屬性 default.windowed.key.serde.inner 和 default.windowed.value.serde.inner 被棄用,取而代之的是一個(gè)新的屬性 windowed.inner.class.serde,供Kafka 消費(fèi)者使用。Kafka Streams 用戶(hù)被推薦配置他們的窗口 SerDe,通過(guò)傳遞這個(gè)到 SerDe 構(gòu)造器,然后在所有的地方使用這個(gè) SerDe。
KIP-633: Deprecate 24 hour default for the grace period in Streams
在 Kafka Streams 中,允許窗口操作根據(jù)一個(gè)稱(chēng)為寬限期的配置屬性處理窗口外的記錄。以前,這個(gè)配置是可選的,很容易被忽略,導(dǎo)致默認(rèn)為24小時(shí)。這經(jīng)常使 Suppression 操作符的用戶(hù)感到困惑,因?yàn)樗鼤?huì)緩沖記錄,直到寬限期結(jié)束,因此會(huì)增加 24 小時(shí)的延遲。在 3.0 中,Windows 類(lèi)通過(guò)工廠方法得到增強(qiáng),這些工廠方法要求使用自定義寬限期或根本沒(méi)有寬限期來(lái)構(gòu)造它們。應(yīng)用了默認(rèn)的24小時(shí)寬限期的舊工廠方法已經(jīng)被棄用,相應(yīng)的 grace() api 與已經(jīng)設(shè)置了此配置的新工廠方法不兼容。
KIP-623: Add "internal-topics" option to streams application reset tool
通過(guò)添加新的命令行參數(shù):--internal-topics,使用應(yīng)用程序重置工具 kafka-streams-application-reset 的 Streams 變得更加靈活。新參數(shù)接受一個(gè)以逗號(hào)分隔的主題名稱(chēng)列表,這些主題名稱(chēng)對(duì)應(yīng)于可以計(jì)劃使用此應(yīng)用程序工具刪除的內(nèi)部主題。將此新參數(shù)與現(xiàn)有參數(shù) --dry-run 結(jié)合使用,允許用戶(hù)在實(shí)際執(zhí)行刪除操作之前確認(rèn)將刪除哪些主題并在必要時(shí)指定其中的一個(gè)子集。
MirrorMaker
KIP-720: Deprecate MirrorMaker v1
在 3.0 版本中,不推薦使用 MirrorMaker 的第一個(gè)版本。今后,新功能和主要改進(jìn)將集中在 MirrorMaker2 (MM2)上。
KIP-716: Allow configuring the location of the offset-syncs topic with MirrorMaker2
在 3.0 中,用戶(hù)現(xiàn)在可以配置 MirrorMaker2 創(chuàng)建和存儲(chǔ)用于轉(zhuǎn)換消費(fèi)者組偏移量的內(nèi)部主題的位置。這將允許 MirrorMaker2 的用戶(hù)將源 Kafka 集群維護(hù)為嚴(yán)格只讀的集群,并使用不同的 Kafka 集群來(lái)存儲(chǔ)偏移記錄(即目標(biāo) Kafka 集群,甚至是源和目標(biāo)集群之外的第三個(gè)集群)。
總結(jié)
Apache Kafka 3.0 是 Apache Kafka 項(xiàng)目向前邁出的重要一步。了解更多:
查閱release notes 完整的更改列表;
觀看發(fā)布視頻了解更多信息;
下載 Apache Kafka 3.0.0 并使用其中的新功能。
這是一項(xiàng)巨大的社區(qū)努力,因此感謝為此版本做出貢獻(xiàn)的所有人,包括我們的所有用戶(hù)以及我們的 141 位作者和審閱者:
A. Sophie Blee-Goldman, Adil Houmadi, Akhilesh Dubey, Alec Thomas, Alexander Iskuskov, Almog Gavra, Alok Nikhil, Alok Thatikunta, Andrew Lee, Bill Bejeck, Boyang Chen, Bruno Cadonna, CHUN-HAO TANG, Cao Manh Dat, Cheng Tan, Chia-Ping Tsai, Chris Egerton, Colin P. McCabe, Cong Ding, Daniel Urban, Daniyar Yeralin, David Arthur, David Christle, David Jacot, David Mao, David Osvath, Davor Poldrugo, Dejan Stojadinovi?, Dhruvil Shah, Diego Erdody, Dong Lin, Dongjoon Hyun, Dániel Urbán, Edoardo Comar, Edwin Hobor, Eric Beaudet, Ewen Cheslack-Postava, Gardner Vickers, Gasparina Damien, Geordie, Greg Harris, Gunnar Morling, Guozhang Wang, Gwen (Chen) Shapira, Ignacio Acu?a Frías, Igor Soarez, Ismael Juma, Israel Ekpo, Ivan Ponomarev, Ivan Yurchenko, Jason Gustafson, Jeff Kim, Jim Galasyn, Jim Hurne, JoelWee, John Gray, John Roesler, Jorge Esteban Quilcate Otoya, Josep Prat, José Armando García Sancio, Juan Gonzalez-Zurita, Jun Rao, Justin Mclean, Justine Olshan, Kahn Cheny, Kalpesh Patel, Kamal Chandraprakash, Konstantine Karantasis, Kowshik Prakasam, Leah Thomas, Lee Dongjin, Lev Zemlyanov, Liu Qiang, Lucas Bradstreet, Luke Chen, Manikumar Reddy, Marco Aurelio Lotz, Matthew de Detrich, Matthias J. Sax, Michael G. Noll, Michael Noll, Mickael Maison, Nathan Lincoln, Niket Goel, Nikhil Bhatia, Omnia G H Ibrahim, Peng Lei, Phil Hardwick, Rajini Sivaram, Randall Hauch, Rohan Desai, Rohit Deshpande, Rohit Sachan, Ron Dagostino, Ryan Dielhenn, Ryanne Dolan, Sanjana Kaundinya, Sarwar Bhuiyan, Satish Duggana, Scott Hendricks, Sergio Pe?a, Shao Yang Hong, Shay Elkin, Stanislav Vodetskyi, Sven Erik Knop, Tom Bentley, UnityLung, Uwe Eisele, Vahid Hashemian, Valery Kokorev, Victoria Xia, Viktor Somogyi-Vass, Viswanathan Ranganathan, Vito Jeng, Walker Carlson, Warren Zhu, Xavier Léauté, YiDing-Duke, Zara Lim, Zhao Haiyuan, bmaidics, cyc, dengziming, feyman2016, high.lee, iamgd67, iczellion, ketulgupta1995, lamberken, loboya~, nicolasguyomar, prince-mahajan, runom, shenwenbing, thomaskwscott, tinawenqiao, vamossagar12, wenbingshen, wycccccc, xjin-Confluent, zhaohaidao
本文翻譯自:What's New in Apache Kafka 3.0.0
--end--
掃描下方二維碼 添加好友,備注【交流】 可私聊交流,也可進(jìn)資源豐富學(xué)習(xí)群
更文不易,點(diǎn)個(gè)“在看”支持一下??
