構建一個純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(); |
您可能會直接跳到 原始碼,但我也邀請您繼續閱讀並瞭解我們是如何構建它的,以及哪些實踐通常適用於客戶端庫。
詳細點選標題
相關文章
- 教你如何構建非同步伺服器和客戶端的 Kotlin 框架 Ktor非同步伺服器客戶端Kotlin框架
- kafka消費者客戶端Kafka客戶端
- Jtti:怎麼構建非同步伺服器和客戶端的Kotlin框架KtorJtti非同步伺服器客戶端Kotlin框架
- HTML轉PDF的純客戶端和純服務端實現方案HTML客戶端服務端
- kafka視覺化客戶端工具(Kafka Tool)的基本使用Kafka視覺化客戶端
- JavaWeb——從零開始構建一個客戶管理系統(一)JavaWeb
- Swoole 協程 MySQL 客戶端與非同步回撥 MySQL 客戶端的對比MySql客戶端非同步
- 使用 Go 和 ReactJS 構建聊天系統(四):處理多個客戶端GoReactJS客戶端
- DoorDash如何使用 Apache Kafka 和 Elasticsearch 構建更快的索引?ApacheKafkaElasticsearch索引
- reqwest:簡單而強大的 Rust HTTP 客戶端RustHTTP客戶端
- websocket(多個客戶端)Web客戶端
- 【git操作】如何在兩個git客戶端間同步程式碼Git客戶端
- Java中的幾種Kafka客戶端比較介紹JavaKafka客戶端
- FishRedux完成一個玩安卓客戶端Redux安卓客戶端
- 如何建立一個Java遊戲客戶端Java遊戲客戶端
- 如何使用客戶端 JSON 模型構建一個 Master-Detail-Detail 佈局中的列表頁面試讀版客戶端JSON模型ASTAI面試
- 主流資料庫和 NoSQL 的 Rust 客戶端驅動程式資料庫SQLRust客戶端
- 自己動手寫一個能操作redis的客戶端Redis客戶端
- 一個支援Sora模型文字生成影片的Web客戶端Sora模型Web客戶端
- 擼了一個可除錯 gRPC 的 GUI 客戶端除錯RPCGUI客戶端
- 一個高顏值Flutter版WanAndroid客戶端FlutterNaNAndroid客戶端
- 寫一個Flutter彩票客戶端--開獎列表Flutter客戶端
- UE 客戶端和伺服器上的時間同步客戶端伺服器
- 全鏈路非同步Rest客戶端 ESA RestClient非同步REST客戶端client
- 支付寶客戶端架構解析:iOS 客戶端啟動效能優化初探客戶端架構iOS優化
- Apache Kafka – 叢集架構ApacheKafka架構
- ETH官方客戶端Geth的使用(一)客戶端
- ftp客戶端軟體,ftp客戶端軟體哪個好用,使用方法FTP客戶端
- Java HTTP/2 客戶端:從阻塞到非同步 - sanjeevrJavaHTTP客戶端非同步VR
- Redis 非同步客戶端選型及落地實踐Redis非同步客戶端
- Linux系統中KafKa安裝和使用方法 java客戶端連線kafkaLinuxKafkaJava客戶端
- 針對客戶細分的RFM模型如何構建?模型
- 支付寶客戶端架構解析:Android 客戶端啟動速度優化之「垃圾回收」客戶端架構Android優化
- Kafka入門(構建TB級非同步訊息系統)及Spring整合KafkaKafka非同步Spring
- 技術基礎 | 改進版的Apache Cassandra客戶端請求路由Apache客戶端路由
- 如果你想在Java中寫一個Http客戶端,你會選擇哪一種方式?Okhttp vs Apache vs JdkJavaHTTP客戶端ApacheJDK
- 如何用Java Socket實現一個簡單的Redis客戶端JavaRedis客戶端
- 基於色鍵技術的純客戶端實時蒙版彈幕客戶端