我正在评估用作事件总线的不同流媒体/消息服务。我正在考虑的一个方面是每项服务提供的订购保证。我正在探索的两个选项是AWS Kinesis和Kafka,从较高的层次来看,它们似乎都提供了类似的订购保证,其中记录保证以仅在该碎片/分区中发布的相同顺序使用。
AWS Kinesis API似乎公开了父分片的id,因此使用KCL的消费者组可以确保具有相同分区键的记录可以按照发布顺序(假设是单线程发布者)被消费,即使分片正在被拆分和合并。
我的问题是,Kafka是否提供了类似的功能,以便即使在发布消息时添加了分区,也可以按顺序使用使用特定键发布的记录?从我的阅读中,我对分区选择的理解(如果您使用记录指定键)表现为哈希(key)%partition\u COUNT
。因此,如果添加了额外的分区,它们将在其中发布具有特定密钥的所有消息的分区可能会发生变化(我已经证明它在本地也会发生变化)。同时,组协调员/组长将在从该主题接收记录的消费者组中的消费者之间重新分配分区所有权。但是,重新分配后,将在两个不同的分区中找到具有相同密钥的记录(可能是未使用的记录)。因此,从使用者组级别来看,是否无法确保现在在不同分区中找到的具有相同密钥的未使用记录将按照发布顺序使用?
我对这两项服务都没有什么经验,所以我的理解可能有缺陷。任何建议都将不胜感激!
我的理解是正确的(经@OneCricketeer和文档证实)。以下是文档的相关部分:
虽然可以随着时间的推移增加分区的数量,但如果消息是用密钥生成的,则必须小心。在发布键控消息时,Kafka会根据密钥的哈希确定地将消息映射到分区。这保证了具有相同密钥的消息总是路由到相同的分区。这种保证对于某些应用程序很重要,因为分区内的消息总是按顺序传递给使用者。如果分区的数量发生变化,则这种保证可能不再有效。为了避免这种情况,通常的做法是稍微过度分区。基本上,您可以根据未来的目标吞吐量(例如一年或两年后)来确定分区的数量。最初,您可以基于当前吞吐量创建一个小型Kafka集群。随着时间的推移,您可以向集群添加更多代理,并按比例将现有分区的子集移动到新代理(可以在线完成)。这样,您就可以跟上吞吐量的增长,而不会在使用键时破坏应用程序中的语义。
我确实意识到Kafka中保证了每个分区的顺序。但是当有多个分区并且生产者没有指定键,而只有1个消费者时,分区会受到什么影响(为什么有1个消费者?对于当前数据加载1很好,有多个分区供将来使用) 1) 订购是否会受到影响? 2) 使用者是否会从分区0,1读取数据。。20一个接一个按顺序? 3) 即使我们指定了分区键,我们是否可以保证我们会进行适当的排序?(哈希冲突的情况除外)
我想使用Mongo变更流,使用kafka Connect将变更事件从mongoDB推送到kafka Topic中。好消息是: > Kafka在分区内维持排序。 Mongo使用全局时钟维护排序。 但是,中间呢?kafka connect怎么样?它维持订购吗?这种订购是如何运作的?我找不到他们说Kafka维持秩序的地方。 这是一个场景: 在Mongo中-更新用户Bob以获得授权 在Mongo中-将用户
阅读这篇关于主题分区中消息排序的文章:https://blog.softwaremill.com/does-kafka-really-guarantee-the-order-of-messages-3ca849fd19d2 允许在不设置最大值的情况下重试。航班请求。每连接到1可能会更改记录的顺序,因为如果将两个批发送到单个分区,第一个失败并重试,但第二个成功,则第二个批中的记录可能会首先出现。 根
我是新的数据流和发布子工具在GCP。 需要将prem过程中的电流迁移到GCP。 当前流程如下: 我们有两种类型的数据馈送 Full Feed–其adhoc作业–完整XML的大小约为100GB(单个XML–非常复杂的一个–完整的数据–ETL作业处理此XML并将其加载到约60个表中) 单独的ETL作业用于处理完整提要。ETL作业过程完全馈送并创建负载就绪文件,所有表将被截断并重新加载 源系统每30分钟
我在应用程序中使用了Kafka 1.0.1,我已经开始使用0.11中引入的幂等生产者功能,在使用幂等生产者功能时,我很难理解排序保证。 我的生产者的配置是: 重试50次 根据文件: 重试 设置一个大于零的值将导致客户端重新发送任何记录,如果该记录的发送失败,可能会出现暂时性错误。请注意,此重试与客户端在收到错误后重新发送记录没有什么不同。允许在不设置最大值的情况下重试。航班请求。每连接到1可能会改
我想知道,在什么情况下,具有相同分区键的消息会进入不同的分区。 我使用下面给出的命令运行了属于同一组的两个消费者在控制台中监听一个主题: 我使用“纳米/Kafka-php”库将消息放入带有键 的主题。当我发送多个这样的消息时,我发现很少有消息转到第二个消费者,而大多数消息都发送给消费者1。 由于我对所有消息使用相同的密钥,因此我希望所有消息都由同一个使用者使用。每个使用者都绑定到每个分区。 我使用