Jafka来源分析——Processor

Jafka来源分析——Processor

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

Jafka Acceptor接受client而建立后的连接请求,Acceptor会将Socket连接交给Processor进行处理。Processor通过下面的处理步骤进行client请求的处理:

1. 读取client请求。

2. 依据client请求类型的不同,调用对应的处理函数进行处理。

Processor读取client请求是一个比較有意思的事情,须要考虑两个方面的事情:第一,请求规则(Processor须要依照一定的规则进行请求的解析)。第二,怎样确定一次请求的读取已经结束(由于是非堵塞连接,很有可能第一次读操作读取了请求的一部分数据,第二次到第N次读取才干把整个client请求读取完整)。以下我们具体解析一下client请求的格式。

client请求首先包括一个int,该int指明本次client请求的大小(size)。随后,请求包括一个两个byte(short)的请求类型(请求类型包括:CreaterRequestDeleterRequestFetchRequestMultiFetchRequestMultiProducerRequestOffsetRequestProducerRequest。然后每种请求类型有固定的格式。下图具体说明了ProducerRequest的格式:

Jafka来源分析——Processor


知道了上面的格式之后,问题二(怎样确定一次请求已经读取完毕)就非常easy攻克了。

首先为“请求长度”分配一个4byteByteBuffer,直到该Buffer读满,否则说明长度一直没有读取完毕。“请求长度”读取完毕后,为请求分配一个“请求长度”大小的ByteBuffer,直到该Buffer读满则说明一次请求读取完毕。读取完毕后,依据“请求类型”调用对应的处理函数(Handler)进行处理。在jafka中,上述的两个Buffer在类BoundedByteBufferReceive中进行声明和管理。Processor接收到Acceptor分配的socket连接后。会为socke连接建立一个BoundedByteBufferReceive并将其与socket连接进行绑定。每当该socket连接“可读”时。将BoundedByteBufferReceive拿出来从上次读取的基础上继续读取。直到一次请求彻底读取完毕,详细过程如以下代码(Processor.read)所看到的:

private void read(SelectionKey key) throws IOException {
SocketChannel socketChannel = channelFor(key);
Receive request = null;
request = new BoundedByteBufferReceive(maxRequestSize);
key.attach(request);
} else {
request = (Receive) key.attachment();
}
int read = request.readFrom(socketChannel);
stats.recordBytesRead(read);
if (read < 0) {
close(key);
} else if (request.complete()) {
Send maybeResponse = handle(key, request);
key.attach(null);
// if there is a response, send it, otherwise do nothing
if (maybeResponse != null) {
key.attach(maybeResponse);
key.interestOps(SelectionKey.OP_WRITE);
}
} else {
// more reading to be done
key.interestOps(SelectionKey.OP_READ);
getSelector().wakeup();
if (logger.isTraceEnabled()) {
logger.trace("reading request not been done. " + request);
}
}
}

BoundedByteBufferReceive.readFrom的实现详细例如以下:主要是申请两个Buffer并不断的读取数据。

public int readFrom(ReadableByteChannel channel) throws IOException {
        expectIncomplete();
        int read = 0;
        if (sizeBuffer.remaining() > 0) {
            read += Utils.read(channel, sizeBuffer);
        }
        if (contentBuffer == null && !sizeBuffer.hasRemaining()) {
            sizeBuffer.rewind();
            int size = sizeBuffer.getInt();
            if (size <= 0) {
                throw new InvalidRequestException(...);
            }
            if (size > maxRequestSize) {
                final String msg = "Request of length %d is not valid, it is larger than the maximum size of %d bytes.";
                throw new InvalidRequestException(format(msg, size, maxRequestSize));
            }
            contentBuffer = byteBufferAllocate(size);
        }
        //
        if (contentBuffer != null) {
            read = Utils.read(channel, contentBuffer);
            //
            if (!contentBuffer.hasRemaining()) {
                contentBuffer.rewind();
                setCompleted();
            }
        }
        return read;
    }

读取完毕后,Processor会解析“请求类型”,依据请求类型的不同调用不同的Handler处理对应于该请求。

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116982.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月12日 下午1:00
下一篇 2022年1月12日 下午2:00


相关推荐

  • 淘宝核心系统团队博客在哪_团队理念

    淘宝核心系统团队博客在哪_团队理念http://rdc.taobao.com/blog/cs/?paged=2这是 淘宝核心系统团队的博客,核心系统团队的总目标是为淘宝和阿里集团打造一个高性能、高可扩展、低碳、低成本、稳定可靠的软件基础设施平台。目前的主要工作领域如下图所示:

    2022年8月13日
    7
  • 问题:如何配置Dify连接讯飞星火API?

    问题:如何配置Dify连接讯飞星火API?

    2026年3月14日
    2
  • Thinkphp5学习笔记

    Thinkphp5学习笔记架构Thinkphp5目录架构thinkphp应用部署目录├─application应用目录(可设置)│├─common公共模块目录(可更改)│├─in

    2021年12月13日
    47
  • ora 01017问题解决办法

    ora 01017问题解决办法SQL&gt;startup ORACLEinstancestarted. TotalSystemGlobalArea 914358272bytes FixedSize                 2088184bytes VariableSize            528483080bytes DatabaseBuffers         3774873…

    2022年6月1日
    40
  • C语言_宏定义

    C语言_宏定义一 预处理 编译一个 C 语言程序的第一步骤就是预处理阶段 这一阶段就是宏发挥作用的阶段 C 预处理器在源代码编译之前对其进行一些文本性质的操作 主要任务包括删除注释 插入被 include 进来的文件内容 定义和替换由 define 定义的符号以及确定代码部分内容是否根据条件编译 if 来进行编译 文本性质 的操作 就是指一段文本替换成另外一段文本 而不考虑其中任何的语义内容 宏仅仅是在 C 预

    2026年3月20日
    2
  • 16个时髦的扁平化设计的 HTML5 & CSS3 网站模板

    16个时髦的扁平化设计的 HTML5 & CSS3 网站模板创建网站最好办法之一是使用现成的网站模板或使用开源 CMS 应用程序 所以 今天这篇文章给大家带来的是 16 款基于 nbsp HTML5 amp nbsp CSS3 nbsp 的精美的扁平风格网站模板 大家可以借助这些优秀的网站模板创建自己的优秀网站 这些网站模板虽然是收费 但是都提供了在线演示 所以 你懂的 您可能感兴趣的相关文章 35 款精致的 CSS3 和 HTML5 网页模板 12 款高质量的免费

    2026年3月17日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号