kafka的架构和组成,kakfa生产者详解

1、kafka集群架构

kafka是典型的分布式消息系统
架构组成:
生产者、消费者、消息服务器(broker)、以及分布式协调服务zookeeper。
消费者采用拉(pull)模式来进行消息的消费。

2、相关概念

消息服务器(broker):kafka集群包含一个或者多个broker,kafka集群的每个节点否是一个broker。
Topic:每条发送到broker的消息,都属于一个topic,用于消息的分组,每个topic都有多个分区。
Partitin:分区,每个topic包含多个partition。
Producer:生产者,消息生产者将消息顺序追加到每个分区日志文件末尾。
Consumer:消息的消费者,同一时刻每个消费者只能负责topic的不同分区。建议消费者的个数等于或者小于topic的分区数,如果消费者个数大于topic的分区数,多余的消费者不进行消息的消费。
Consumer Group:消费者组,每个消费者都属于一个消费者组。如果不指定那么就是默认消费者组。
zookeeper:zookeeper节点类型有两个维度,是否永久,是否可靠

3、kafka生产者详解

生产者组成:

kafka生产者由两个线程组成:主线程以及sender线程。

消息发送过程

主线程由KafkaProducer发送消息,发送消息会经过消息拦截器,消息序列化器,分区器然后加入消息累加器(RecordAccumulator)中。
sender线程:负责从消息累加器取消息将消息发送给kafka。
从创建kafkaProducer开始就创建了一个ProducerRecord,里边包含了,topic名,以及分区号,时间戳其他key-value。ProducerRecord需要经过消息拦截器,序列化器,将其转化成为字节数组,然后在网络上传输,到达分区器后,根据有效的分区号,将消息发送到指定的分区,如果没有指定分区号,则根据key进行hash运算。

时间戳配置

CreateTime:消息产生的时间戳
LogAppendTime:表示生产者记录的时间戳将在消息添加到日志时,由broker重写

返回值

broker写入消息后会返回一个RecordMetadata对象,里边包含了主题和分区信息,以及分区的偏移量,上述两种时间戳,如果失败,则返回错误,生产者收到错误消息后,会尝试重新发送消息,如果还是失败,则返回错误信息。

发送消息的三种模式

1、发送既忘fire-and-forget
发送之后就不管消息是否发送成功,能够达到最大的吞吐量
2、同步发送sync
利用future对象,阻塞线程,直到返回成功
3、异步发送async
在send发送中定义一个CallBack函数,返回响应的时候调用该函数,实现异步发送确认。

kafka分区机制

1、默认分区
如果没有指定分区,则根据key进行hash运算,根据key的hash选择分区,本质上还是hash分区。
如果没有分区也没有key,则粘性地选择分区。
2、hash分区
根据key进行hash运算,根据hash选择一个分区
3、轮训分区
将消息均匀的发送到每个分区
4、黏性分区
只要当前分区没有被填满,就尽可能的使用该分区,一旦分区被填满,则选择别的分区。
5、自定义分区策略
需要再生产者中定义ProducerConfig.PARTITIONER_CLASS_CONFIG,自定义分区器需要实现Partitioner

生产者压缩机制

GZIP、Snappy、LZ4

生产者拦截器

自定义生产者拦截器需要实现ProducerInterceptor接口
有三个方法,onSend()、onAcknowledgement()、close()
onSend(): 发送前,发给序列化器
onAcknowledge(): 在接收到返回结果的时候触发,如果有回调函数,则在回调函数之前触发,拦截器是放在I/O线程里边的,不能放太重的业务逻辑,否则回影响生产者性能。
close(): 关闭拦截器关闭之前将一些清理任务放在里边执行。

可以自定义多个拦截器,放入list集合,传入ProducerConfig里边,指定多个拦截器,会按顺序执行,如果拦截器出现异常则不会被抛出,生产者回将异常消息记录到错误日志。

生产者参数配置:

acks:1,0, -1(all)
acks为1时,是默认的参数,当生产者将消息发送到broker,broker的leader将消息写入分区,不等其他的follower同步完成,就会返回写入成功。
当出现leader写入完毕后宕机的情况,就会导致消息丢失
acks为0时,生产者将消息发送出去后就不再管是否写入成功,这种情况下吞吐量最大,但是也最不可靠,可能有大量的消息丢失
acks为-1或者all时,producer发送后,等待leader写入,并且follower全部同步完毕后,才会返回写入成功的应答

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值