这里使用rust-rdkafka
基于librdkafka
的 Rust 库,你还可以选择kafka
(纯Rust实现的Kafka客户端)
一、安装Kafka
见:https://juejin.cn/post/7429667424926023699
二、添加依赖
tokio = { version = "1.39.3", features = ["full"] }
# windows
rdkafka = { version = "0.25", features = ["cmake-build"] }
# linux
rdkafka = "0.36.2"
Windows需要编译librdkafka
,需要提前安装以下依赖
GNU toolchain
:工具链https://gnutoolchains.com/mingw64/GNU make
:https://www.gnu.org/software/software.htmlpthreads
:zlib
:可选,默认包含libz,所以需要安装<git clone https://github.com/madler/zlib.git>cmake
:可选,默认不包含(cmake-build需要)libssl-dev
:可选,默认情况下不包含(ssl需要)libsasl2-dev
:可选,默认情况下不包含(gssapi需要)libzstd-dev
:可选,默认情况下不包含(zstd-pkg-config需要)
1、Windows安装GNU toolchain
- windows使用MSYS2安装MinGW即可:https://www.msys2.org/
- 打开直接全部默认下一步
- 解安装后更新依赖
pacman -Syu
- 安装工具链,回车->y,路径在
C:\msys64\mingw64\bin
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
- 配置环境变量
- 验证
gcc --version
以下的步骤也可以使用MSYS2安装
2、Windows安装Cmake
- 下载后https://cmake.org/download/直接按照即可
- 验证
cmake --version
3、Windows安装GNU make
- 选一个下载方式
- 下载
- 编辑
build_w32.bat
文件,将gunmake改为make
- 解压后cmd打开当前目录,然后执行
build_w32.bat
- 将
WinRel
文件夹复制到一个合适的位置,然后添加环境变量
添加到系统环境变量
- 验证
make -v
4、Windows安装zlib
- 克隆项目
git clone https://github.com/madler/zlib.git
- cmd打开
cmake-gui
,指定源文件目录和构建后的目录(需要自己创建)
- 配置
配置失败清除缓存再次配置
- 生成
- 以管理员身份打开Visual studio
- 打开build目录的
zlib.sln
文件
- 右键
INSTALL
设置为启动项目
- 再次右键点击生成
以下目录有文件即安装成功C:\Program Files (x86)\zlib
三、使用
use std::time::Duration;
use rdkafka::producer::{ FutureProducer, FutureRecord };
use rdkafka::Message;
use rdkafka::{ config::ClientConfig, consumer::StreamConsumer };
use rdkafka::consumer::Consumer;
#[tokio::main]
async fn main() {
// 生产者
let producer: FutureProducer = ClientConfig::new()
.set("bootstrap.servers", "127.0.0.1:9092")
.set("message.timeout.ms", "5000")
.create()
.expect("生产者创建失败");
let topic = "test";
// 发送消息返回状态
let delivery_status = producer.send::<Vec<u8>, _, _>(
// 消息体
FutureRecord::to(&topic).payload("hello from Tokio"),
// 超时时间
Duration::from_secs(0)
);
// 等待消息发送结果(使用 await 等待 delivery_status 这个 Future 完成)
match delivery_status.await {
Ok(_) => println!("消息成功发送到Kafka主题 {}", topic),
Err(_) => println!("消息发送失败"),
}
// 消费者
let consumer: StreamConsumer = ClientConfig::new()
.set("bootstrap.servers", "127.0.0.1:9092")
.set("session.timeout.ms", "6000")
.set("enable.auto.commit", "false")
.set("auto.offset.reset", "earliest")
.set("group.id", "rust-rdkafka-smol-runtime-example")
.create()
.expect("创建消费者失败");
// 订阅topic
consumer.subscribe(&[topic]).expect("订阅失败");
// 循环消费消息
loop {
match consumer.recv().await {
Ok(message) => {
println!(
"Received message at topic: {} partition: {} offset: {} payload: {:?}",
message.topic(),
message.partition(),
message.offset(),
// 转换为字符串
message.payload().map(|p| String::from_utf8_lossy(p).into_owned())
);
}
Err(e) => {
eprintln!("消费失败: {}", e);
}
}
}
}
这里有三条是因为设置了earliest
,之前创建的Topic没有删除
删除后发送一条接收一条