为了账号安全,请及时绑定邮箱和手机立即绑定

关于kafka的处理请求(1)

标签:
Java

处理请求:

    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确认才可以认为一个消息写入是成功的。

  1.     如果acks=1,那么只要首领收到消息就认为写入成功

  2.     如果acks=all,那么需要所有同步副本收到消息才算成功

  3.     如果acks=0,那么生产者在把消息发出去之后,完全不需要等待broker的响应(是不是感觉很像发送消息中的---发送并忘记方式)

    包含首领副本的broker在收到生产请求,会对请求做出一些验证:

  1.     发送数据的用户是否拥有主题写入权限?

  2.     请求里包含的acks值是否有效?(只允许出现0、1、all)

  3.     如果acks=all,是否有足够多的同步副本保证消息已经被完全写入?(可以对broker进行配置,如果同步数量不总,broker可以拒接处理新消息)

    kafka不会一直等待数据被写到磁盘上--------依赖复制功能来保证消息的持久性,在消息被褥分区的首领后,broker开始检查acks配置

下一篇地址:https://www.imooc.com/article/263344


    

    

        


 

 

 


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消