構建一個純Rust非同步的Apache Kafka客戶端 - influxdata
InfluxDB的未來核心是InfluxDB IOx, 使用的是Apache Kafka 對資料進行排序:
到目前為止,我們一直依賴於 rust-rdkafka,它為librdkafka提供非同步繫結,而 librdkafka又是用 C 編寫的。
那麼我們為什麼要替換它呢?以下是一些原因:
- 複雜性: librdkafka 是一個複雜的庫,其中包含大量我們不需要或不想要的功能,它支援廣泛的 Kafka 版本,而我們基本上執行的是“最新版本”。由於 rust-rdkafka 也只公開了 librdkafka 功能的一小部分,我們認為這也可能適用於其他使用者。
- 繫結: rust-rdkafka 試圖將 librdkafka 塞入 Rust 非同步生態系統。這在一定程度上可行,但會導致一些問題,例如當從不同執行緒執行回撥時,tokio 會感到困惑。繫結本身也有一些限制。
- 緩衝/模組化: 我們對 librdkafka 中的緩衝和批處理工作方式的控制有限。這是跨語言庫的固有問題。
- 專業知識和見解: 錯誤和意外行為很難除錯。我們對在生產中使用當前狀態感到不舒服。
- 可行性: 我們只使用非常有限的 Kafka 功能子集(例如,沒有事務),為此 Kafka 協議相當簡單。對於這個子集,編寫一個新客戶端實際上是可行的。
這就是為什麼我們決定在 Rust 中啟動一個簡單、新鮮、完全非同步的 Kafka 客戶端: RSKafka。
這是一個快速使用示例。首先,我們設定一個客戶端:
let connection = "localhost:9093".to_owned(); let client = ClientBuilder::new(vec![connection]).build().await.unwrap(); |
讓我們建立一個主題:
let topic = "my_topic"; let controller_client = client.controller_client().await.unwrap(); controller_client.create_topic( topic, 2, // partitions 1, // replication factor 5_000, // timeout (ms) ).await.unwrap(); |
然後我們生產和消費一些資料:
// get a client for writing to a partition let partition_client = client .partition_client( topic.to_owned(), 0, // partition ) .await .unwrap(); // produce some data let record = Record { key: b"".to_vec(), value: b"hello kafka".to_vec(), headers: BTreeMap::from([ ("foo".to_owned(), b"bar".to_vec()), ]), timestamp: OffsetDateTime::now_utc(), }; partition_client.produce(vec![record]).await.unwrap(); // consume data let (records, high_watermark) = partition_client .fetch_records( 0, // offset 1..1_000_000, // min..max bytes 1_000, // max wait time ) .await .unwrap(); |
您可能會直接跳到 原始碼,但我也邀請您繼續閱讀並瞭解我們是如何構建它的,以及哪些實踐通常適用於客戶端庫。
詳細點選標題
相關文章
- Spring Cloud構建客戶端SpringCloud客戶端
- .NET環境構建CAS客戶端客戶端
- kafka消費者客戶端Kafka客戶端
- HTML轉PDF的純客戶端和純服務端實現方案HTML客戶端服務端
- 教你如何構建非同步伺服器和客戶端的 Kotlin 框架 Ktor非同步伺服器客戶端Kotlin框架
- kafka視覺化客戶端工具(Kafka Tool)的基本使用Kafka視覺化客戶端
- Kafka 處理器客戶端介紹Kafka客戶端
- JavaWeb——從零開始構建一個客戶管理系統(一)JavaWeb
- 初探Thrift客戶端非同步模式客戶端非同步模式
- 純java開發的電子郵件客戶端Java客戶端
- Jtti:怎麼構建非同步伺服器和客戶端的Kotlin框架KtorJtti非同步伺服器客戶端Kotlin框架
- 給遊戲引擎開發者的 64 個建議(1):客戶端遊戲引擎客戶端
- rsync 客戶端同步的時候報錯客戶端
- Swoole 協程 MySQL 客戶端與非同步回撥 MySQL 客戶端的對比MySql客戶端非同步
- Homebrew進階使用教程(二)-用一個命令列天氣客戶端構建自己的倉庫命令列客戶端
- FishRedux完成一個玩安卓客戶端Redux安卓客戶端
- 手擼一個新聞客戶端客戶端
- 建立一個Twisted Reactor TCP客戶端ReactTCP客戶端
- 如何建立一個Java遊戲客戶端Java遊戲客戶端
- reqwest:簡單而強大的 Rust HTTP 客戶端RustHTTP客戶端
- websocket(多個客戶端)Web客戶端
- DoorDash如何使用 Apache Kafka 和 Elasticsearch 構建更快的索引?ApacheKafkaElasticsearch索引
- 用 Unity 做個遊戲(八) - 客戶端邏輯結構和網路同步機制Unity遊戲客戶端
- 客戶端JavaScript的5個弊端客戶端JavaScript
- 使用 Go 和 ReactJS 構建聊天系統(四):處理多個客戶端GoReactJS客戶端
- Java中的幾種Kafka客戶端比較介紹JavaKafka客戶端
- GankIo又一個ReactNative客戶端React客戶端
- 【git操作】如何在兩個git客戶端間同步程式碼Git客戶端
- 如何使用客戶端 JSON 模型構建一個 Master-Detail-Detail 佈局中的列表頁面試讀版客戶端JSON模型ASTAI面試
- 主流資料庫和 NoSQL 的 Rust 客戶端驅動程式資料庫SQLRust客戶端
- 構造CAS客戶端的登入Servlet客戶端Servlet
- 一個高顏值Flutter版WanAndroid客戶端FlutterNaNAndroid客戶端
- 寫一個Flutter彩票客戶端--開獎列表Flutter客戶端
- React Native 專案(One 【一個】客戶端)React Native客戶端
- CXF入門教程(2) -- 第一個客戶端客戶端
- 自己動手寫一個能操作redis的客戶端Redis客戶端
- 一個POP3客戶端的C#類 (轉)客戶端C#
- 一個支援Sora模型文字生成影片的Web客戶端Sora模型Web客戶端