Kafka相关知识

kafka是一个高吞吐量的分布式的发布订阅系统。

一、生产者大概运行流程

1.一条消息过来首先会被封装成一个ProducerRecord对象

2.接下来要对这个对象进行序列化,因为Kafka的消息要从客户端传到服务器端,涉及到网络传输,所以需要实现序列化。Kafka提供了默认的序列化方式,也支持自定义序列化。

3.消息序列化完了之后,对消息要进行分区,分区的时候需要获取集群的元数据。分区的这个过程很关键,因为这个时候就决定了我们这条消息会被发送到kafka服务端的哪个主题哪个分区了。

4.分好区的消息不是直接被发送到服务端,而是放入了生产者的一个缓存里。在这个缓存里,多条消息会被封装成一个批次,默认的一个批次大小为16K。

5.sender线程启动后会从缓存里去获取可以发送的批次。

6.sender线程把一个一个批次发送到服务端。

https://mp.weixin.qq.com/s/ZpV_oaxCrtlOiVq_0_EuSA

 

1)producer:消息生产者,发布消息到kafka集群的终端或服务

2)broker:kafaka集群中包含的服务器

3)topic:每条发布到kafka集群的消息属于的类别,即kafka是面向topic的

4)partition:每个topic包含一个或者多个partition,kafka的分配单位是partition

5)comsumer:从kafka集群中消费消息的终端或服务

6)comsumer group:每个consumer都属于一个consumer group,每条消息只能被consumer group中的一个comsumer group消费

7)replica:partition的副本,保障partition的高可用

8)leader:replica中的一个角色,producer和consumer只跟leader交互

9)follower:replica中的一个角色,从leader中复制数据

10)controller:kafka集群中的一个服务器,用来进行leader election以及各种failover

11)zookeeper:kafka通过zookeeper来存储集群的meta信息

 

很多传统的message queue都会在消息被消费完之后将消息删除,一方面避免重复消费,另一方面可以保证queue的长度比较少,提高效率。Kafka并不删除已消费的消息,为了实现传统message queue消息只被消费一次的语义,Kafka保证同一个consumer group里只有一个consumer会消费一条消息。与传统message queue不同的是,Kafka还允许不同consumer group同时消费同一条消息,这一特性可以为消息的多元化处理提供了支持。实际上,Kafka的设计理念之一就是同时提供离线处理和实时处理。根据这一特性,可以使用strom这种实时流处理系统对消息进行实时在线处理,同时使用hadoop这种批处理系统进行离线处理,还可以同时将数据实时备份到另一个数据中心,只需要保证这三个操作所使用的consumer在不同的consumer group即可。

对于传统的message queue而言,一般会删除已经被消费的消息,而kafka集群会保留所有的消息,无论其被消费与否。当然,因为磁盘的限制,不可能永久保留所有的数据,因此kafka提供两种策略去删除旧数据。一是基于时间,二是基于partition文件大小。

Kafka会为每一个consumer group保留一些metadata信息——当前消费的消息的position,即offset。这个offect由consumer控制。正常情况下consumer会在消费完一条消息后线性增加这个offset。当然,consumer也可将offset设成一个较小的值,重新消费一些消息。因为offset是无状态的,它不需要标记哪些消息被消费过,不需要通过broker去保证同一个consumer group只有一个consumer能消费某一条消息,因此也就不需要锁机制,这也为kafka的高吞吐率提供了有力保障。

C++使用librdkafka库实现kafka的消费实例

1) 创建kafka配置

RdKafka::conf *conf = nullptr;

Conf = RdKafka::conf::create(RdKafka::conf::CONF_GLOBAL);

2) 设置kafka各项参数

Conf->set(“bootstrap.servers”, brokers_, errstr);  //设置broker list

Conf->set(“group.id”, groupid_, errstr);  //设置consumer group

Conf->set(“max.partition.fetch.bytes”, strfetch_num, errstr);  //每次从单个分区中拉取消息的最大尺寸

3) 创建kafka topic配置

RdKafka::conf *tconf = nullptr;

tconf = RdKafka::conf::create(RdKafka::conf::CONF_TOPIC);

4) 设置kafka topic参数

If(tconf->set(“auto.offset.reset”, “smallest”, errstr))

5) 创建kafka consumer实例

Kafka_consumer_=RdKafka::Consumer::create(conf, errstr);

6) 创建kafka topic

RdKafka::Topic::create(kafka_consumer_, topics_, tconf, errstr);

7) 启动kafka consumer实例

RdKafka::ErrorCode resp = kafka_consumer_->start(topic_, partition_, offset_);

8) 消费kafka

Kafka_consumer_->consume(topic_, partition_, timeout_ms);

9) 阻塞等待消息

Kafka_consumer_->poll(0);

10)停止消费

Kafka_consumer_->stop(topic_, partition_);

11)销毁consumer实例

RdKafka::wait_destroyed(5000);

 

一个典型的kafka集群中包含若干个producer(可以是web前端产生的page view,或者是服务器日志,系统CPU、memory等),若干broker(kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干consumer group,以及一个zookeeper集群。Kafka通过zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance。Producer使用push模式将消息发布到broker,consumer使用pull模式从broker订阅并消费消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值