C++_中间件kafka-回调函数

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

3. Handle Headers Queue Event Metadata

 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
posted @ 2024-10-15 08:52  辰令  阅读(182)  评论(0)    收藏  举报