Apache Kafka 3.0.0 穩(wěn)定版發(fā)布,有哪些值得關(guān)心的變化?
點擊上方 "大數(shù)據(jù)肌肉猿"關(guān)注, 星標(biāo)一起成長
后臺回復(fù)【加群】,進入高質(zhì)量學(xué)習(xí)交流群

Apache Kafka 3.0 于2021年9月21日正式發(fā)布。本文將介紹這個版本的新功能。以下文章翻譯自 《What's New in Apache Kafka 3.0.0》。
我很高興地代表 Apache Kafka? 社區(qū)宣布 Apache Kafka 3.0 的發(fā)布。Apache Kafka 3.0 是一個大版本,其引入了各種新功能、API 發(fā)生重大變化以及對 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 開始,Producer 默認(rèn)啟用最強的交付保證(acks=all,enable.idempotence=true)。這意味著默認(rèn)情況下消息將有序并且持久性。
此外,不要錯過 Kafka Connect 任務(wù)重啟增強、Kafka Streams 基于時間戳同步的改進以及 MirrorMaker2 更靈活的配置選項。
要完整的特性和功能增強,可以到 release notes 里面了解。您還可以觀看發(fā)布視頻,了解 Apache Kafka 3.0.0 中新增功能的簡要介紹。
普通變化
KIP-750 (Part I): Deprecate support for Java 8 in Kafka
Apache Kafka 項目的所有組件在 3.0 中都將 Java 8 標(biāo)記為 deprecated。這給用戶足夠的時間在下一個主要版本(4.0)之前進行調(diào)整,那時候 4.0 將不再支持 Java 8。
KIP-751 (Part I): Deprecate support for Scala 2.12 in Kafka
Apache Kafka 項目的所有組件在 3.0 中都將 Scala 2.12 標(biāo)記為 deprecated。這給用戶足夠的時間在下一個主要版本(4.0)之前進行調(diào)整,那時候 4.0 將不再支持 Scala 2.12。
Kafka Broker, Producer, Consumer 和 AdminClient 方面的改進
KIP-630: Kafka Raft Snapshot
我們在 3.0 中引入的一個主要功能是 KRaft Controllers 和 KRaft Brokers,能夠為元數(shù)據(jù)主題 __cluster_metadata 的分區(qū)生成、復(fù)制和加載快照。Kafka 集群使用這個主題來存儲和復(fù)制有關(guān)集群的元數(shù)據(jù)信息,例如 Broker 配置、topic 分區(qū)分配、leadership 等。隨著此狀態(tài)的增長,Kafka Raft Snapshot 提供了一種有效的方式來存儲、加載和復(fù)制(replicate)這些信息 .
KIP-746: Revise KRaft Metadata Records
Kafka Raft Controller 第一版的經(jīng)驗和持續(xù)開發(fā)表明,我們需要修改一些元數(shù)據(jù)記錄類型(metadata record types),這些元數(shù)據(jù)記錄類型在 Kafka 配置不使用 ZooKeeper 的時候需要使用。
KIP-730: Producer ID generation in KRaft mode
在 KIP-730 中,Kafka Controller 現(xiàn)在完全接管生成 Kafka Producer ID 的功能。Controller 在 ZK 和 KRaft 模式下都是這么做的。這讓我們離橋式發(fā)布( bridge release)更近了一步,這將允許用戶從使用 ZK 的 Kafka 部署過渡到使用 KRaft 的新部署。
KIP-679: Producer will enable the strongest delivery guarantee by default
從 3.0 開始,Kafka Producer 默認(rèn)打開冪等性(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 秒。這將允許消費者在默認(rèn)情況下更好地適應(yīng)暫時的網(wǎng)絡(luò)故障,并避免當(dāng)消費者只是暫時離開組時的連續(xù)重新平衡(consecutive rebalances)。
KIP-709: Extend OffsetFetch requests to accept multiple group ids
支持請求 Kafka 消費者組的當(dāng)前偏移量的功能已經(jīng)存在一段時間了。但是獲取多個消費者組的偏移量需要對每個組進行單獨的請求。在 KIP-709 中,fetch 和 AdminClient API 被擴展為支持在單個請求/響應(yīng)中同時讀取多個消費者組的偏移量。
KIP-699: Update FindCoordinator to resolve multiple Coordinators at a time
支持能夠同時高效地應(yīng)用于多個消費者組的操作,在很大程度上取決于客戶有效地發(fā)現(xiàn)這些組的協(xié)調(diào)者的能力。這可以通過 KIP-699 實現(xiàn),它增加了對通過一個請求發(fā)現(xiàn)多個組的協(xié)調(diào)器的支持。Kafka 客戶端已經(jīng)更新在與新的支持此請求的 Kafka broker 交互時使用此優(yōu)化。
KIP-724: Drop support for message formats v0 and v1
自 2017 年 6 月隨 Kafka 0.11.0 推出四年以來,消息格式 v2 一直是默認(rèn)消息格式。因此,由于已經(jīng)有足夠多的場景使用這個格式,3.0 的主要發(fā)行版為我們提供了一個很好的機會來棄用舊的消息格式——即 v0 和 v1,這些格式現(xiàn)在很少使用。在 3.0 中,如果用戶將 Broker 配置為使用消息格式 v0 或 v1,則會收到警告。這個選項將在 Kafka 4.0 中被移除(有關(guān)v0和v1消息格式的棄用的細(xì)節(jié)和含義,請參閱 KIP-724)。
KIP-707: The future of KafkaFuture
當(dāng) KafkaFuture 類型被引入以方便 Kafka AdminClient 的實現(xiàn)時,Java 8 之前的版本仍在廣泛使用,并且 Kafka 正式支持 Java 7。幾年后,Kafka 運行在支持 CompletionStage 和 CompletableFuture 類類型的 Java 版本上。通過 KIP-707,KafkaFuture 增加了一個方法來返回 CompletionStage 對象,以向后兼容的方式增強了 KafkaFuture 的可用性。
KIP-466: Add support for List serialization and deserialization
KIP-466 為 generic lists 的序列化和反序列化添加了新的類和方法——這一特性對 Kafka 客戶端和 Kafka Streams 都非常有用。
KIP-734: Improve AdminClient.listOffsets to return timestamp and offset for the record with the largest timestamp
用戶列出 Kafka 主題/分區(qū)偏移量的能力已得到擴展。使用 KIP-734,用戶現(xiàn)在可以要求 AdminClient 返回 topic/分區(qū)中具有最高時間戳的記錄的偏移量和時間戳。(不要將此與 AdminClient 已經(jīng)返回的最新偏移量混淆,后者是要寫入 topic/分區(qū)中的下一個記錄的偏移量。) 對現(xiàn)有 ListOffsets API 的這個擴展允許用戶通過詢問最近寫入的記錄的偏移量以及它的時間戳來探測分區(qū)的活躍度。
Kafka Connect
KIP-745: Connect API to restart connector and tasks
在 Kafka Connect 中,connector 在運行時被表示為一組 Connector 類實例和一個或多個 Task 類實例,通過 Connect REST API 對 connectors 的大多數(shù)操作都可以應(yīng)用到整個組中。一個值得注意的例外是 Connector 和 Task 實例的重啟端點(restart endpoints)。要重新啟動整個連接器,用戶必須單獨調(diào)用以重新啟動連接器實例和任務(wù)實例。在 3.0 中,KIP-745 使用戶能夠通過一次調(diào)用重新啟動所有或僅失敗的連接器的 Connector 和 Task 實例。此功能是一項附加功能,重啟 REST API 的先前行為保持不變。
KIP-738: Removal of Connect's internal converter properties
在之前的主要版本(Apache Kafka 2.0)中棄用之后,internal.key.converter 和 internal.value.converter 作為配置屬性和前綴在 Connect worker 的配置中被刪除。接下來,內(nèi)部 Connect 主題將專門使用 JsonConverter 來存儲沒有嵌入模式的記錄。任何使用不同轉(zhuǎn)換器的現(xiàn)有 Connect 集群都必須將其內(nèi)部主題移植到新格式(有關(guān)升級路徑的詳細(xì)信息,請參閱 KIP-738)。
KIP-722: Enable connector client overrides by default
從 Apache Kafka 2.3.0 開始,Connect worker 可以配置為允許連接器配置覆蓋連接器使用的 Kafka 客戶端屬性。這是一個廣泛使用的特性,現(xiàn)在隨著主要版本的發(fā)布,默認(rèn)情況下啟用了覆蓋連接器客戶端屬性的功能(connector.client.config.override.policy 默認(rèn)為 All)。
KIP-721: Enable connector log contexts in Connect Log4j configuration
另一個在 2.3.0 中引入但到目前為止尚未默認(rèn)啟用的功能是連接器日志上下文(connector log contexts)。這在 3.0 中發(fā)生了變化,連接器上下文默認(rèn)添加到 Connect 工作器的 log4j 日志 pattern 中。從以前的版本升級到 3.0 將通過添加連接器上下文來更改log4j導(dǎo)出的日志行格式。
Kafka Streams
KIP-695: Further improve Kafka Streams timestamp synchronization
KIP-695 增強了 Streams 任務(wù)如何選擇獲取記錄的語義,并擴展了配置屬性 max.task.idle.ms 的含義和可用值。此更改需要 Kafka Consumer API 中名為 currentLag 的新方法;如果本地已知,它能夠返回一個特定分區(qū)的消費者延遲,并且不需要和 Kafka Broker 交互。
KIP-715: Expose committed offset in streams
從 3.0 開始,TaskMetadata 接口增加了三個新方法:committedOffsets、endOffsets 和 timeCurrentIdlingStarted。這些方法允許 Streams 應(yīng)用程序跟蹤任務(wù)的進度和運行狀況。
KIP-740: Clean up public API in TaskId
KIP-740 中對 TaskId 類進行了重大更新。一些方法和所有內(nèi)部字段都已棄用,新的 subtopology() 和 partition() getters 將取代舊的 topicGroupId 和分區(qū)字段(另請參閱 KIP-744 以了解相關(guān)更改和對 KIP-740 的修正)。
KIP-744: Migrate TaskMetadata and ThreadMetadata to an interface with internal implementation
KIP-744 對 KIP-740 中提出的更改做了進一步修改,并將實現(xiàn)與許多類的公共 API 分開。為了實現(xiàn)這一點,引入了新的接口 TaskMetadata、ThreadMetadata 和 StreamsMetadata,同時棄用了具有相同名稱的現(xiàn)有類。
KIP-666: Add Instant-based methods to ReadOnlySessionStore
交互式查詢 API 使用 ReadOnlySessionStore 和 SessionStore 接口中的一組新方法進行了擴展,這些方法接受 Instant 數(shù)據(jù)類型的參數(shù)。此更改將影響需要實現(xiàn)新方法的任何自定義只讀交互式查詢會話存儲實現(xiàn)。
KIP-622: Add currentSystemTimeMs and currentStreamTimeMs to ProcessorContext
ProcessorContext 在 3.0 中新增了兩個新方法:currentSystemTimeMs 和 currentStreamTimeMs。新方法使用戶能夠分別查詢緩存的系統(tǒng)時間和流時間(streams time),并且可以在生產(chǎn)和測試代碼中以統(tǒng)一的方式使用它們。
KIP-743: Remove config value 0.10.0-2.4 of Streams built-in metrics version config
3.0 中取消了對 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開始就是默認(rèn)值)。
KIP-741: Change default SerDe to be null
刪除了默認(rèn) SerDe 屬性之前的默認(rèn)值,Streams 之前的默認(rèn)值為 ByteArraySerde。從 3.0 開始,沒有默認(rèn)值,并且用戶需要在 API 中根據(jù)需要設(shè)置他們的 SerDe,或者在其 Streams 配置中通過 DEFAULT_KEY_SERDE_CLASS_CONFIG 和 DEFAULT_VALUE_SERDE_CLASS_CONFIG 設(shè)置默認(rèn)值。先前的默認(rèn)值幾乎總是不適用于實際應(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è)置這個配置值。注意,新的默認(rèn)值需要 Kafka Brokers 2.5 或更高版本。
KIP-732: Deprecate eos-alpha and replace eos-beta with eos-v2
另一個在 3.0 中被棄用的 Streams 配置值是 exactly_once 作為 processing.guarantee 屬性的值。exacly_once 值對應(yīng)的是精確一次語義(Exactly Once Semantics,EOS)的原始實現(xiàn),任何連接到 Kafka 集群版本 0.11.0 或更新版本的 Streams 應(yīng)用程序都可以使用。EOS 的第一個實現(xiàn)已經(jīng)被 Streams 中的EOS 的第二個實現(xiàn)所取代,后者由 processing.guarantee 屬性中的 exact_once_beta 配置表示。接下來,名稱 exactly_once_beta 也被棄用,并被新的 exactly_once_v2 取代。在下一個主要版本(4.0)中,exacly_once 和 exacly_once_beta 都將被刪除,僅留下 exacly_once_v2 作為 EOS 交付保證的唯一選項。
KIP-725: Streamlining configurations for WindowedSerializer and WindowedDeserializer
配置屬性 default.windowed.key.serde.inner 和 default.windowed.value.serde.inner 被棄用,取而代之的是一個新的屬性 windowed.inner.class.serde,供Kafka 消費者使用。Kafka Streams 用戶被推薦配置他們的窗口 SerDe,通過傳遞這個到 SerDe 構(gòu)造器,然后在所有的地方使用這個 SerDe。
KIP-633: Deprecate 24 hour default for the grace period in Streams
在 Kafka Streams 中,允許窗口操作根據(jù)一個稱為寬限期的配置屬性處理窗口外的記錄。以前,這個配置是可選的,很容易被忽略,導(dǎo)致默認(rèn)為24小時。這經(jīng)常使 Suppression 操作符的用戶感到困惑,因為它會緩沖記錄,直到寬限期結(jié)束,因此會增加 24 小時的延遲。在 3.0 中,Windows 類通過工廠方法得到增強,這些工廠方法要求使用自定義寬限期或根本沒有寬限期來構(gòu)造它們。應(yīng)用了默認(rèn)的24小時寬限期的舊工廠方法已經(jīng)被棄用,相應(yīng)的 grace() api 與已經(jīng)設(shè)置了此配置的新工廠方法不兼容。
KIP-623: Add "internal-topics" option to streams application reset tool
通過添加新的命令行參數(shù):--internal-topics,使用應(yīng)用程序重置工具 kafka-streams-application-reset 的 Streams 變得更加靈活。新參數(shù)接受一個以逗號分隔的主題名稱列表,這些主題名稱對應(yīng)于可以計劃使用此應(yīng)用程序工具刪除的內(nèi)部主題。將此新參數(shù)與現(xiàn)有參數(shù) --dry-run 結(jié)合使用,允許用戶在實際執(zhí)行刪除操作之前確認(rèn)將刪除哪些主題并在必要時指定其中的一個子集。
MirrorMaker
KIP-720: Deprecate MirrorMaker v1
在 3.0 版本中,不推薦使用 MirrorMaker 的第一個版本。今后,新功能和主要改進將集中在 MirrorMaker2 (MM2)上。
KIP-716: Allow configuring the location of the offset-syncs topic with MirrorMaker2
在 3.0 中,用戶現(xiàn)在可以配置 MirrorMaker2 創(chuàng)建和存儲用于轉(zhuǎn)換消費者組偏移量的內(nèi)部主題的位置。這將允許 MirrorMaker2 的用戶將源 Kafka 集群維護為嚴(yán)格只讀的集群,并使用不同的 Kafka 集群來存儲偏移記錄(即目標(biāo) Kafka 集群,甚至是源和目標(biāo)集群之外的第三個集群)。
總結(jié)
Apache Kafka 3.0 是 Apache Kafka 項目向前邁出的重要一步。了解更多:
查閱release notes 完整的更改列表;
觀看發(fā)布視頻了解更多信息;
下載 Apache Kafka 3.0.0 并使用其中的新功能。
這是一項巨大的社區(qū)努力,因此感謝為此版本做出貢獻的所有人,包括我們的所有用戶以及我們的 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--
掃描下方二維碼 添加好友,備注【交流】 可私聊交流,也可進資源豐富學(xué)習(xí)群
更文不易,點個“在看”支持一下??
