我正在寻找关于这个问题的一些澄清.在Kafka文档中,我发现了以下内容:
Kafka仅对分区内的消息提供总订单,而不是在主题中的不同分区之间.对于大多数应用程序而言,按分区排序与按键分区数据的能力相结合就足够了.但是,如果您需要对邮件进行总订单,则可以使用仅包含一个分区的主题来实现,但这意味着每个使用者组只有一个使用者进程.
所以这是我的问题:
这是否意味着如果我想拥有超过1个消费者(来自同一组)从一个主题中读取我需要超过1个分区?
这是否意味着我需要相同数量的分区作为同一组的消费者数量?
有多少消费者可以从一个分区读取?
关于API的关键和分区之间的关系也有一些问题.我只看了.net API(特别是来自MS的API),但看起来像模仿Java API.我看到当使用生产者向主题发送消息时,有一个关键参数.但是,当消费者从主题中读取时,存在分区号.
提前致谢.
我在我的应用程序中使用Kafka 1.0.1,并且已经开始使用0.11中引入的Idempotent Producer功能,并且在使用Idempontent功能时难以理解订购保证。
我的生产者的配置是:
enable.idempotence = true
max.in.flight.requests.per.connection = 5
retries = 50
acks = all
根据文档:
重试
设置大于零的值将导致客户端重新发送其发送失败并带有潜在的瞬时错误的任何记录。请注意,此重试与客户端在收到错误后重新发送记录没有什么不同。允许重试而不将max.in.flight.requests.per.connection设置为1可能会更改记录的顺序,因为如果将两个批次发送到单个分区,并且第一个批次失败并被重试,但是第二个批次成功,则记录在第二批中可能会首先出现。
使能
当设置为“ true”时,生产者将确保每个消息的确切副本被写入流中。如果为“ false”,则生产者由于代理失败等原因而重试,可能会将重试消息的副本写入流中。请注意,启用幂等性要求max.in.flight.requests.per.connection小于或等于5,重试大于0,ack必须为“ all”。如果用户未明确设置这些值,则将选择合适的值。如果设置了不兼容的值,则将引发ConfigException。
我的配置似乎符合要求,但它们似乎不一致。
我必须与OutOfOrderSequenceException有关的另一个问题是:根据文档,如果得到此异常,则意味着生产者有可能出现故障。但是,如果我的生产者配置了,max.in.flight.requests.per.connection = 5并且说第二个请求出现了乱序异常,那么以下所有已经运行的请求又会发生什么呢?这是否意味着我确定会出现故障?
我有一个有 10 个分区的主题,1 个消费者组有 4 个消费者,工作人员大小为 3。
我可以看到分区中的消息分布不均匀,一个分区有很多数据,另一个是免费的。
如何让我的生产者将负载平均分配到所有分区,以便所有分区都得到正确利用?