1.Kafka基本内容
01.生产者: 同步发送 异步发送 异步发送回调
02.producer topic
KAFKA_BROKER_ID bootstrap_servers
1.Kafka
producer topic message
consumer offset Rebalance ConsumerGroupMetadata KafkaConsumer
broker partition Metadata Leader broker
TopicPartition
2.create
conf kafka_conf kafka_topic_conf
timeout_ms
mem_malloc() mem_free()
ErrorCode Internal_errors broker errors
error_code error_flags error_string
create
wait_destroyed
callbacks: EventCb DeliveryReportCb PartitionerCb
ConsumeCb RebalanceCb OffsetCommitCb
Conf::ConfResult event_cb dr_cb partitioner_cb
consume_cb rebalance_cb offset_commit_cb default_topic_conf
resume pause
具体过程
RdKafka::poll()
RdKafka::Producer::create()
RdKafka::Producer::produce()
RdKafka::KafkaConsumer::create()
RdKafka::KafkaConsumer::closed()
RdKafka::KafkaConsumer::subscribe()
RdKafka::KafkaConsumer::consume()
RdKafka::KafkaConsumer::assign()
RdKafka::KafkaConsumer::commitSync()
2.Kafka cmd/WebUI
01.docker安装 : docker run -d --name kafka -p 9092:9092 apache/kafka:3.7.0
本机通信和外部访问设置
vim /docker-data/kafka-data/server.properties
# 把 IP 配置成 0.0.0.0 listeners 指明 kafka 当前节点监听本机的哪个网卡
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
# 我们要通过 linux 访问 docker 容器中的 kafka 所以把 IP 配置成 linux 的 IP
## advertised.listeners 这个参数为我们服务器的地址,否则我们通过python是无法向kafka生产消息
advertised.listeners=PLAINTEXT://自己的 IP:9092
02.web UI
需要安装KafkaManager
03.Command line
docker exec -it kafka /bin/bash
## 查询所有Topic列表
/opt/kafka/bin/kafka-topics.sh --list --bootstrap-server localhost:9092
/opt/kafka/bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic test
/opt/kafka/bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --partitions 0 --topic localKafka
/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic localKafka --from-beginning
3.Kafka Client 编程
Python 版本
from kafka import KafkaProducer,KafkaConsumer
from kafka.structs import TopicPartition
bootstap_servers
C++版本
librdkafka src是用c实现的源码,而src-cpp是在c接口上包装的一层c++类,实现了基本的功能
必要的参数配置(bootstrap.servers)
RdKafka::Conf *conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL);
conf->set("metadata.broker.list", brokers, errstr);
RdKafka::Producer *producer = RdKafka::Producer::create(conf, errstr);
Kafka Conf对象、Topic Conf对象、设置Broker属性、Producer、Topic对象等
librdkafka 提供的 异步的生产接口,异步的消费接口和同步的消费接口,没有同步的生产接口
RdKafka::Conf RdKafka::Metadata
RdKafka::Producer RdKafka::Topic RdKafka::TopicPartition
RdKafka::Message RdKafka::Event
RdKafka::ErrorCode
RdKafka::EventCb RdKafka::DeliveryReportCb
RdKafka::RebalanceCb RdKafka::PartitionerCb
定义一个 DeliveryReportCb 回调函数来处理消息的发送报告。
这个回调函数会在消息成功发送到Kafka broker或者发送失败时被调用。
注册rebalance_cb回调函数会关闭rdkafka的自动分区赋值和再分配并替换应用程序的rebalance_cb回调函数
Consumer 需要向 Kafka 汇报自己的位移数据,这个汇报过程被称为提交位移(Committing Offsets)
enable.auto.commit (bool) 如果为True,将自动定时提交消费者offset。默认为True
auto.commit.interval.ms(int) 自动提交offset之间的间隔毫秒数。如果enable_auto_commit为true,默认值为 5000。
触发brokerlist更新
分区机制:Partition机制
Range# 特点 确保每个消费者消费的分区数量是均衡的。
partition.assignment.strategy,修改分区的分配策略
Event 事件是从RdKafka传递错误、统计信息、日志等消息到应用程序的通用接口
class ConsumerEventCb : public RdKafka::EventCb
其他
C语言中的多线程编程:POSIX线程库(Pthreads)
Pthreads为C/C++等基于Unix/Linux系统的编程语言提供了统一、跨平台的线程创建、同步、互斥、调度等接口
线程(Thread)
POSIX threads 也称作为Pthreads,
一个单进程可以包含多个线程,多个线程共享同样的全局内存包括全局变量和堆段,但是每个线程有自己的栈存放一些局部变量
#include "rdkafka.h" #include "rdkafkacpp.h"
pure virtual abstract classes.
纯虚类:抽象类abstract class是指至少有一个纯虚函数的类,如果一个类全部由纯虚函数组成,不包括任何的实现,被称为纯虚类
纯虚函数是一种没有实现体的虚函数,它在基类中声明,并且至少包含一个纯虚函数的类被称为抽象类
C++的虚函数可以在子类中重写,调用是根据实际的对象来判别的,而不是通过指针类型(普通函数的调用是根据当前指针类型来判断的)
回调函数
1.回调函数机制:CallBack
1、定义一个函数(普通函数即可); --#->定义回调函数
2、将此函数的地址注册给调用者; --#->设置回调 -注册回调函数
3、特定的事件或条件发生时,调用者使用函数指针调用回调函数。 --#-> 回调处理
2.函数指针
是指一个变量,函数对象创建后就会分配一个地址,这个地址可以通过变量进行保存。
这个变量就叫做函数地址变量,也可以称之为函数指针
参考
C++实现kafka的生产者客户端 https://zhuanlan.zhihu.com/p/614462015
docker安装kafka集群 https://www.cnblogs.com/aaalei/p/17530193.html
docker启动kafka并挂载配置文件,并让外部环境连接kafka https://blog.csdn.net/q2570558854/article/details/141687742
简单聊聊C++中回调函数的实现 https://www.jb51.net/article/235073.htm