处理请求:
Broker的大部分工作是处理客服端,分区副本和控制器发送给分区首领的请求。Kafka提供了一个二进制协议(基于TCP),指定了请求消息分格式以及broker如何对请求最初响应。Broker按照请求的到达的顺序来处理它们---这种顺序保证了让kafka具有消息队列的特性,同时保证保存的消息是有序的
所有的请求都包含一个保准的消息头:
Request-type:也就是API key
RequestVersion:broker可以处理不同的版本的客服端请求,并且根据客服单版本做出不同的响应
Correlation ID:一个具有唯一性的数字,用于标识请求消息,同时也会出现在响应消息和错误日志中(用于诊断问题)
Client ID:用于标识发送请求的客服端
broker 会在它所监听的每一个端口上运行一个 Accepto线程,这个钱程会创建一个连接,并把它交给 Pocesso 线程去处理。 Pocesso 线程(也被叫作“网络线程”)的数量是可配置的。网络线程负责从客户端获取请求悄息,把它们放进请求队列,然后从晌应队列获取响应消息,把它们发送给客户端。
请求消息被放到请求队列后, IO线程会负责处理它们。下面是几种最常见的请求类型 :
生产请求:生产者发送的请求,包含客服端要写入broker的消息
获取请求:在消费者和跟随者副本需要从broker读取消息时发送的请求
而kafka客户端要自己负责把生产请求和获取请求发送到正确的broker上。
所以这就牵扯到另一问题:客服端如何知道该往哪里发送请求?
kafka客服端实现另一种请求:元数据请求
这种请求包含了客服端感兴趣的主题列表。服务端的响应消息指明了这些主题所包含的分区都有哪些副本,以及那个副本是首领。元数据秦秋可以发送个任意一个broker,因为所有的broker都缓存了这些消息
生产消息
这里先介绍一下acks配置参数---这个参数指定了需要多少个broker确认才可以认为一个消息写入是成功的。
如果acks=1,那么只要首领收到消息就认为写入成功
如果acks=all,那么需要所有同步副本收到消息才算成功
如果acks=0,那么生产者在把消息发出去之后,完全不需要等待broker的响应(是不是感觉很像发送消息中的---发送并忘记方式)
包含首领副本的broker在收到生产请求,会对请求做出一些验证:
发送数据的用户是否拥有主题写入权限?
请求里包含的acks值是否有效?(只允许出现0、1、all)
如果acks=all,是否有足够多的同步副本保证消息已经被完全写入?(可以对broker进行配置,如果同步数量不总,broker可以拒接处理新消息)
kafka不会一直等待数据被写到磁盘上--------依赖复制功能来保证消息的持久性,在消息被褥分区的首领后,broker开始检查acks配置
下一篇地址:https://www.imooc.com/article/263344