JJ1*_*15k 4 c# apache-kafka kafka-consumer-api confluent
启动融合的dotnet使用者时,在调用订阅和随后的轮询之后,似乎需要很长时间才能从服务器接收到“分配的分区”事件,并因此收到消息(大约10-15秒)。
起初我以为会有自动创建主题的开销,但是无论消费者的主题/消费者组是否已经存在,时间都是相同的。
我从此配置开始使用我的使用者,其余代码与合并的高级使用者示例相同:
var kafkaConfig = new Dictionary<string, object>
{
{"group.id", config.ConsumerGroup},
{"statistics.interval.ms", 60000},
{"fetch.wait.max.ms", 10},
{"bootstrap.servers", config.BrokerList},
{"enable.auto.commit", config.AutoCommit},
{"socket.blocking.max.ms",1},
{"fetch.error.backoff.ms",1 },
{"socket.nagle.disable",true },
{"auto.commit.interval.ms", 5000},
{
"default.topic.config", new Dictionary<string, object>()
{
{"auto.offset.reset", "smallest"}
}
}
};
Run Code Online (Sandbox Code Playgroud)
kafka集群由具有默认设置的远程数据中心中的3台中低端规格机器组成。是否可以调整代理或客户端设置以减少启动时间?
编辑:使用“分配”而不是“订阅”自己分配分区,导致启动时间约为2秒
Kafka使用者是按小组设计工作的-您看到的延迟是小组协调员(驻留在群集上,而不是客户端)等待任何现有/先前的会话超时,并允许任何其他使用者使用在将分区分配给具有活动连接的所有使用者之前启动同一组。
实际上,如果您足够快地重新启动测试使用者,则您会看到延迟跃升至将近30秒,因为session.timeout.ms
默认值为30000,并且群集仍未“通知”前一个使用者直到此时间才消失。超时开始。另外,如果您group.id
在两次重新启动之间进行更改,则会看到延迟急剧下降,因为群集将不会等待属于另一个组的现有使用者。
最后,在再次启动之前尝试干净地退出消费者(调用Unsubscribe()并确保消费者已处置)。
似乎session.timeout.ms
可以降低到6000以减少任何现有使用者组连接的超时,但是不能降低。
即使一切都开始“干净”,您似乎仍然会延迟多达7秒钟(我猜是标准连接设置,还要等待同一组中的所有其他使用方开始)。如果使用Assign()而不是Subscribe(),则您选择自己将分区分配给使用者,并且自动组平衡不适用。