Rust整合Kafka

这里使用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 makehttps://www.gnu.org/software/software.html
  • pthreads
  • 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

  1. windows使用MSYS2安装MinGW即可:https://www.msys2.org/

在这里插入图片描述

  1. 打开直接全部默认下一步

在这里插入图片描述

  1. 解安装后更新依赖
pacman -Syu
  1. 安装工具链,回车->y,路径在C:\msys64\mingw64\bin
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
  1. 配置环境变量

在这里插入图片描述

  1. 验证
gcc --version

以下的步骤也可以使用MSYS2安装

2、Windows安装Cmake

  1. 下载后https://cmake.org/download/直接按照即可

在这里插入图片描述

  1. 验证
cmake --version

3、Windows安装GNU make

  1. 下滑找到makehttps://www.gnu.org/software/software.html

在这里插入图片描述

  1. 选一个下载方式

在这里插入图片描述

  1. 下载

在这里插入图片描述

  1. 编辑build_w32.bat文件,将gunmake改为make

在这里插入图片描述

  1. 解压后cmd打开当前目录,然后执行build_w32.bat

在这里插入图片描述

  1. WinRel文件夹复制到一个合适的位置,然后添加环境变量

在这里插入图片描述

添加到系统环境变量

在这里插入图片描述

  1. 验证
make -v

4、Windows安装zlib

  1. 克隆项目
git clone https://github.com/madler/zlib.git
  1. cmd打开cmake-gui,指定源文件目录和构建后的目录(需要自己创建)

在这里插入图片描述

  1. 配置

在这里插入图片描述

配置失败清除缓存再次配置

在这里插入图片描述

  1. 生成

在这里插入图片描述

  1. 以管理员身份打开Visual studio

在这里插入图片描述

  1. 打开build目录的zlib.sln文件

在这里插入图片描述

  1. 右键INSTALL设置为启动项目

在这里插入图片描述

  1. 再次右键点击生成

在这里插入图片描述

在这里插入图片描述

以下目录有文件即安装成功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没有删除
在这里插入图片描述
删除后发送一条接收一条

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cci497

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值