Apache kafka 卡夫卡:你做什么;soTimeout'';缓冲区大小';和';最小字节数';对简单消费者来说意味着什么?

Apache kafka 卡夫卡:你做什么;soTimeout'';缓冲区大小';和';最小字节数';对简单消费者来说意味着什么?,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,我在用卡夫卡 0.8.2.1简单消费者。有人能解释一下SimpleConsumer和FetchRequestBuilder的几个配置参数的含义吗?除了阅读卡夫卡的源代码外,我在上面找不到任何文档。(我曾尝试将此问题发布到卡夫卡用户组,但没有成功): --Q1:在SimpleConsumer构造函数的签名中,我看到Int'soTimeout'参数- 这个超时是什么意思?这是连接卡夫卡代理的超时吗?从任何[或特定的???]卡夫卡请求(如FetchRequest)获取响应时超时?还有别的吗 kafka

我在用卡夫卡 0.8.2.1简单消费者。有人能解释一下SimpleConsumer和FetchRequestBuilder的几个配置参数的含义吗?除了阅读卡夫卡的源代码外,我在上面找不到任何文档。(我曾尝试将此问题发布到卡夫卡用户组,但没有成功):

--Q1:在SimpleConsumer构造函数的签名中,我看到Int'soTimeout'参数- 这个超时是什么意思?这是连接卡夫卡代理的超时吗?从任何[或特定的???]卡夫卡请求(如FetchRequest)获取响应时超时?还有别的吗

kafka.javaapi.consumer.SimpleConsumer
    (val host: String,
     val port: Int,
     val soTimeout: Int,
     val bufferSize: Int,
     val clientId: String)
--问题2:同样,SimpleConsumer构造函数接受Int'bufferSize'参数。这是什么意思?这是发出fetchRequest时SimpleConsumer将读取的字节数吗?或者它是每次从Kafka获取读取的最大字节数?如果有更多数据可用,将发生多次获取

class FetchRequestBuilder():
    def addFetch(topic: String, partition: Int, offset: Long, fetchSize: Int)

    def build() = {
      val fetchRequest= FetchRequest(versionId, correlationId.getAndIncrement, clientId, replicaId, maxWait, minBytes, requestMap.toMap)

FetchRequest(versionId: Short = FetchRequest.CurrentVersion,
    correlationId: Int = FetchRequest.DefaultCorrelationId,
    clientId: String = ConsumerConfig.DefaultClientId,
    replicaId: Int = Request.OrdinaryConsumerId,
    maxWait: Int = FetchRequest.DefaultMaxWait,
    **minBytes: Int = FetchRequest.DefaultMinBytes**,
...)
--当通过FetchRequestBuilder构建FetchRequest(见下文)时,我还需要指定“fetchSize”:

FetchRequest req= newFetchRequestBuilder ()
  .clientId(kafkaGroupId)
  .addFetch(topic, partition, offset, fetchSizeInBytes)
  .build();
查看FetchRequestBuilder的源代码,我认为(我不是Scala专业人士)这些调用 转换为下面的方法调用—在这里,传入FetchRequest的最后一个参数被称为“minBytes”,这暗示这可能不是确切的获取大小。这是否意味着它甚至不会获取任何东西,除非至少有“minBytes”的数据可用

class FetchRequestBuilder():
    def addFetch(topic: String, partition: Int, offset: Long, fetchSize: Int)

    def build() = {
      val fetchRequest= FetchRequest(versionId, correlationId.getAndIncrement, clientId, replicaId, maxWait, minBytes, requestMap.toMap)

FetchRequest(versionId: Short = FetchRequest.CurrentVersion,
    correlationId: Int = FetchRequest.DefaultCorrelationId,
    clientId: String = ConsumerConfig.DefaultClientId,
    replicaId: Int = Request.OrdinaryConsumerId,
    maxWait: Int = FetchRequest.DefaultMaxWait,
    **minBytes: Int = FetchRequest.DefaultMinBytes**,
...)
所以,我的最后一个问题是:

--问题3:“bufferSize”和“fetchSize/minBytes”之间有什么关系?他们到底定义了什么?我必须做些什么吗 确定一个比另一个小或更细

谢谢


Marina

soTimeout是等待连接到给定代理的时间(以毫秒为单位)。我不知道这个连接有什么特别的事情发生,除了你得到确认,那里有一个代理,准备执行一些后续的操作

我认为构造函数中使用的bufferSize是客户端套接字用于接收代理发送的数据的缓冲区大小


对于最后一个问题,如果提取请求出于任何原因返回的字节总数大于请求的套接字缓冲区大小,则需要多个低级调用来检索所有数据,即使只有一个高级提取调用。

谢谢,Chris。当数据量超过套接字的缓冲区大小时,可能会有多个低级回迁。不过,我仍然不清楚“fetchSize/minBytes”指定了什么。比如说,如果minBytes=200,但有100字节的消息可供使用-消费者会等待至少有200字节可用吗??或者,它是一个建议的在一个低级获取调用中从Kafka获取数据的“块”大小?谢谢如果没有可用的消息,则在获取时引发异常(此等待期间有一个特定的超时值)。否则,fetch将检索一定数量的消息,其数量由fetchSize暗示。理想情况下,返回的消息的总大小将大于获取大小,但如果没有足够的消息,则在给定的时间段后仅返回该数字。