Kafka设计原理解析--producer发送

背景

kafka在实际中会经常的使用,之前只是对于api的使用方式有所了解,但是对于其中的细节以及原理不是很清楚,会造成一种知其然,不知其所以然的后果,对于个人的成长提升不利,因此希望系统的对于kafka内部的设计细节做一次学习梳理

kafka是什么?

kafka比较官方的定义是一种高吞吐量的分布式发布订阅消息系统,主要用来做消息的异步处理、系统解耦、削峰控流处理,是不是这几个词都看的懂,但是组合到一起看的比较懵,别急,一个一个解释:

  1. 系统解耦
    快递员跟收件人来打比方的话,快递员送货如果都送到每个人手里的话,那么快递员要一个个打电话,收件人收到电话之后,要在家等着快递。快递员跟收件人是紧密耦合在一起的。如果门口保安可以代收快递的话,快递员跟收件人就解耦了,快递员放在门口保安处,收件人去门口保安处领,就可以了,不用必须等着或者必须送到。这种就叫解耦
  2. 异步处理
    还是上面的例子,快递员给收件人打电话,说马上送快递。收件人说不行,要去上班,你放门口老大爷那就行。就是说收件人不用等着送到才进行下一件事,这就叫做异步处理。
  3. 削峰限流
    有一天你买的快递到了,你媳妇、你爸妈买的快递都到了,打电话都让你去取,他们分别在小区的东南西北门都有,半个小时不取的话,就走了。你这个时候会不会手忙脚乱。但是这会你跟他们说:都给我放在南门老大爷那边。这会就是快递员去放到那边,你可以慢慢的取了。这就是削峰限流的意思

上面几个例子中,门口保安老大爷就可以认为是kafka在系统中起到的作用。那么你可能要问了,kafka这么厉害,长什么样子?

kafka系统架构图

kafka架构图
上图所示,就是kafka的整体架构图,主要来说分为四个部分,下面主要对这四个部分的功能做一个简单介绍
producer:消息生产者,主要是连接kafka的broker,发送消息
broker:主要是对消息进行存储,并且会冗余备份,方便消费者查消息
consumer:主要是对消息进行消费,订阅具体的分组,消费队列里的消息。

producer生产消息

我们已经知道了kafka的大体架构,假设我们现在有一些消息要发送,需要自己来设计一个producer的话,那么我们应该如何去做呢,我们会面临几个问题,发到哪个队列?发送给谁?怎么样的发送方式?怎么知道有没有成功?有没有什么提高优化的方式?

发到哪个队列?

在发送之前,我们会设置发送的分组等信息,那么我们要发送到那个队列呢?如果我们来设计的话,可能需要支持几种模式,指定发到什么队列,默认发到哪个队列,其实kafka内部也是这么设计,主要分为三种模式

  1. 指定发送某个队列,可以直接指定发送的队列
  2. 设定key,按照key的hash值,对于parittion的个数取模,分配到某一个队列,在key不变的情况下,一直发送这个队列
  3. 什么都没设置,会按照轮询的方式发送到各个队列,这个待考证

发送到哪个机器?

在broker上面会有多台机器,每台机器都会有分区的数据,那么要发到哪一台机器呢?我们希望可以有一个节点告诉我们,哪一台是需要发送的队列,那么这个节点是什么机器呢?这里就不得不提zk在kafka里面的作用了
其实kafka里面zk的作用,就是有管理全局broker的功能,当kafka集群启动的时候,zk有所有broker的信息,这个时候所有的broker节点会去zk上面注册争当小队长,小队长的角色就是知道有多少个机器,每个分区哪个是leader,哪个是follower;然后把这些信息告诉所有的broker,这样不管哪台broker上面都有这些信息了,所以这块的步骤主要是如下:

  1. produer:集群,我的分区是x,我应该发到哪台机器上?
  2. broker集群:我看下你这个分区x的leader分区在哪,在ip:1234上面
  3. producer:收到,会往1234 分区x上面发消息
    具体如下图所示:
    kafkaproducer发送过程

如何发送?

kafka里面有两种发送模式

  1. 同步发送:这种方式是指在发送的时候,等到结果之后,再做后续处理
  2. 异步发送:这种方式是只管发,可以用回调函数来做对应的处理

由于频繁发送的话,可能会比较占网络,可以在参数设置batch的方式进行发送

怎么知道是否发送成功

producer发送完之后,是需要等待brokers的应答成功,并且也可以设置重试的次数,这块有一个比较有意思的点是,如何定义应答成功,这个可以在broker的部分细讲。

总结

这块重点有contoller的作用,以及发送时候的顺序,及kafka的整体架构的一个简单理解
发现从0到1的这种设计思路梳理还是有点hold不住,需要从点到面的综合提升

参考:

1、https://zhuanlan.zhihu.com/p/68052232
2、http://kafka.apache.org/documentation/#design
3、https://zhuanlan.zhihu.com/p/68052232

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值