SocketServer
说明,socketserver主要用于处理kafka server对外提交网络请求的操作,用于检查连接数,把请求添加到请求的队列中,对KafkaApis提供操作支持.
实例创建与启动
socketServer = new SocketServer(config, metrics, kafkaMetricsTime)
socketServer.startup()
实例初始化生成:
得到listeners配置的值,默认是PLAINTEXT://:port,前面部分是协议,
可配置为PLAINTEXT,SSL,SASL_PLAINTEXT,SASL_SSL.
private val endpoints = config.listeners
得到num.network.threads配置的处理网络请求的线程个数配置,默认是3.
private val numProcessorThreads = config.numNetworkThreads
得到queued.max.requests配置的请求队列的最大个数,默认500.
private val maxQueuedRequests = config.queuedMaxRequests
这里生成总的处理线程的个数,用于网络请求,根据listener的个数与网络线程个数的乘积.默认只有一个listener.
private val totalProcessorThreads = numProcessorThreads * endpoints.size
得到max.connections.per.ip配置的单机IP的最大连接个数的配置,默认不限制.
private val maxConnectionsPerIp = config.maxConnectionsPerIp
得到max.connections.per.ip.overrides配置的针对某个特别的IP的连接个数限制的重新设置值.
多个IP配置间使用逗号分开,如:host1:500,host2:600
private val maxConnectionsPerIpOverrides = config.maxConnectionsPerIpOverrides
this.logIdent = "[Socket Server on Broker " + config.brokerId + "], "
生成用于网络请求的管道,管道的处理线程数就是配置的线程数*listeners的个数,请求队列的大小就是配置的队列大小.
val requestChannel = new RequestChannel(totalProcessorThreads, maxQueuedRequests)
实例启动:
def startup() {
this.synchronized {
这里根据每个ip对应的连接数限制,生成一个用于对连接数进行记数的quotas实例.
connectionQuotas = new ConnectionQuotas(maxConnectionsPerIp,
maxConnectionsPerIpOverrides)
读取如下配置项,用于生成socket中SO_SNDBUF,SO_RCVBUF等的buffer的大小.
读取socket.send.buffer.bytes配置项,默认值100kb,这个用于SOCKET发送数据的缓冲区大小.
读取socket.receive.buffer.bytes配置项默认值100kb,这个用于SOCKET的接收数据的缓冲区大小.
读取socket.request.max.bytes配置的值,这个用于设置每次请求的数据大小.默认值,100MB.
读取connections.max.idle.ms配置的值,默认为10分钟,用于设置每个连接最大的空闲回收时间.
val sendBufferSize = config.socketSendBufferBytes
val recvBufferSize = config.socketReceiveBufferBytes
val maxRequestSize = config.socketRequestMaxBytes
val connectionsMaxIdleMs = config.connectionsMaxIdleMs
得到配置项broker.id的值.
val brokerId = config.brokerId
这里根据每一个endpoint(也就是配置的listener的协议与端口),生成处理的网络线程Processor与Acceptor实例.并启动endpoint对应的Acceptor实例.在生成Acceptor的实例时,会同时启动此实例中对应的线程处理实例数组Processor.
var