Kafka源码分析之InFlightRequests

https://blog.csdn.net/lipeng_bigdata/article/details/51121651

InFlightRequests是对已经被发送或正在被发送但是均未接收到响应的客户端请求集合的一个封装,在它内部,有两个重要的变量,如下:

 

 
  1. // 每个连接最大执行中请求数

  2. private final int maxInFlightRequestsPerConnection;

  3.  
  4. // 节点node至客户端请求双端队列Deque<ClientRequest>的映射集合

  5. private final Map<String, Deque<ClientRequest>> requests = new HashMap<String, Deque<ClientRequest>>();

        其中,requests是节点node至客户端请求双端队列Deque<ClientRequest>的映射集合,其中key为字符串形式的节点node,value为一个双端队列Deque,其中的元素为客户端请求ClientRequest。当有新请求需要处理时,会在队首入列,而实际被处理的请求,则是从队尾出列,保证入列早的请求先得到处理。maxInFlightRequestsPerConnection不消多说,它是限制每个连接,即每个node对应客户端请求队列大小的一个阈值。

        既然InFlightRequests本质上是对客户端请求按照node区分的一个双端队列映射集合,那么我们来看下它的队列入队及出队操作。

        首先,入队是通过add()方法来完成的,代码如下:

 

 
  1. /**

  2. * Add the given request to the queue for the connection it was directed to

  3. * 将给定请求添加至其对于连接的队列

  4. */

  5. public void add(ClientRequest request) {

  6.  
  7. // 从requests集合中根据给定请求的目的地node获取Deque<ClientRequest>双端队列reqs

  8. Deque<ClientRequest> reqs = this.requests.get(request.request().destination());

  9.  
  10. // 如果双端队列reqs为nul

  11. if (reqs == null) {

  12. // 构造一个双端队列ArrayDeque类型的reqs

  13. reqs = new ArrayDeque<>();

  14.  
  15. // 将请求目的地node至reqs的对应关系添加到requests集合

  16. this.requests.put(request.request().destination(), reqs);

  17. }

  18.  
  19. // reqs队列首部添加请求request,使用的是addFirst()方法

  20. reqs.addFirst(request);

  21. }

        逻辑很简单,大体如下:

        1、从requests集合中根据给定请求的目的地node获取Deque<ClientRequest>双端队列reqs;

        2、如果双端队列reqs为nul:

              2.1、构造一个双端队列ArrayDeque类型的reqs;

              2.2、将请求目的地node至reqs的对应关系添加到requests集合;

        3、reqs队列首部添加请求request,使用的是addFirst()方法。

        这里,最关键的一点是它将请求添加至双端队列的队首,使用的是addFirst()方法。

        出队是通过completeNext()来实现的,代码如下:

 

 
  1. /**

  2. * Get the oldest request (the one that that will be completed next) for the given node

  3. * 获取给定节点node的时间最久执行中请求,作为接下来要完成的请求

  4. */

  5. public ClientRequest completeNext(String node) {

  6.  
  7. // 根据给定节点node获取客户端请求双端队列reqs,并从poll出队尾元素

  8. // add时是通过addFirst()方法添加到队首的,所以队尾的元素是时间最久的,也是应该先处理的

  9. return requestQueue(node).pollLast();

  10. }

        completeNext()方法根据给定节点node获取客户端请求双端队列reqs,并从poll出队尾元素。所以,这里我们简单总结下,add时是通过addFirst()方法添加到队首的,所以队尾的元素是时间最久的,也是应该先处理的,故出队应该用pollLast(),将存储时间最久的元素移出进行处理。
 

Kafka 0.9.0 是一个分布式流处理平台,用于高效地处理和传输大规模数据流。它采用了发布-订阅的消息队列模型,能够以高吞吐量、低延迟的方式处理数据。 在源码分析上,我可以给你一些大致的指导,但是详细的分析可能需要具体的问题或主题。以下是一些主要的模块和功能,你可以根据需要选择感兴趣的部分进行深入研究: 1. Broker:Kafka 的核心组件,负责接收、存储和转发消息。可以了解 Broker 的启动过程、消息存储机制和网络通信模块等。 2. Producer:负责向 Kafka 集群发送消息。可以了解 Producer 的消息发送流程、消息分区机制和消息确认机制等。 3. Consumer:负责从 Kafka 集群消费消息。可以了解 Consumer 的消息订阅机制、消费者组管理和消息位移管理等。 4. Topic 和 Partition:Kafka 将消息分为多个 Topic,并将每个 Topic 划分为多个 Partition。可以了解 Topic 和 Partition 的创建、分配和管理等。 5. Replica 和 Leader-Follower:Kafka 使用副本机制来保证数据的可靠性。可以了解 Replica 的同步和选举机制,以及 Leader-Follower 模型的实现细节。 6. ZooKeeper:Kafka 使用 ZooKeeper 来进行集群的协调和管理。可以了解 Kafka 对 ZooKeeper 的依赖和使用方式。 以上只是一些主要的模块和功能,Kafka源码非常庞大和复杂,涉及到很多细节和算法。如果你有具体的问题或感兴趣的主题,我可以提供更详细的指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值