做网站如何引用头部,wordpress商业站,金华网站建设哪里好,什么是网站抄袭目录 1 分区2 消费者3 Kafka 如何保证消息的消费顺序#xff1f;3.1 方案一3.2 方案二 4 消息积压 在项目中使用kafka作为消息队列#xff0c;核心工作是创建生产者—包装数据#xff1b;创建消费者----包装数据。 欠缺一些思考#xff0c;特此梳理项目中使用kafka遇到的一… 目录 1 分区2 消费者3 Kafka 如何保证消息的消费顺序3.1 方案一3.2 方案二 4 消息积压 在项目中使用kafka作为消息队列核心工作是创建生产者—包装数据创建消费者----包装数据。 欠缺一些思考特此梳理项目中使用kafka遇到的一些问题和解决方案 1 分区
参考博文点击链接 分区主题可以被分为若干个分区partition同一个主题中的分区可以不在一个机器上有可能会部署在多个机器上由此来实现 kafka 的伸缩性单一主题中的分区有序但是无法保证主题中所有的分区有序 示例假设有一个主题TopicA有三个分区Partition 0、Partition 1、Partition 2。如果生产者产生了5条消息该如何分配
这就涉及到了kafka的分区机制了
kafka 的分区策略指的就是将生产者发送到哪个分区的算法。Kafka 为我们提供了默认的分区策略同时它也支持你自定义分区策略。
分区策略有
顺序轮询 下面示例介绍随机轮询 Kafka中消息的分配到分区的过程是由分区器Partitioner来负责的。默认情况下Kafka使用的是轮询分区策略也就是说生产者产生的消息会依次被分配到不同的分区以此循环。
假设有一个主题TopicA有三个分区Partition 0、Partition 1、Partition 2。如果生产者产生了5条消息这些消息会被轮询地分配到这三个分区中直到所有消息都被发送。分配的过程如下
第1条消息分配到 Partition 0 第2条消息分配到 Partition 1 第3条消息分配到 Partition 2 第4条消息再次分配到 Partition 0 第5条消息再次分配到 Partition 1
这样的分配方式保证了各个分区的负载均衡。总体而言如果有足够的消息量这些消息会在各个分区之间均匀分布从而实现了平均分配的效果。
需要注意的是分区策略是可以配置的你可以自定义分区器来实现不同的分配策略但默认情况下轮询分区是常见的方式。 2 消费者
消费组 消费数据的时候都必须指定一个group id指定一个组的id假定程序A和程序B指定的group id号一样那么两个程序就属于同一个消费组。 特殊: 比如有一个主题topicA程序A去消费了这个topicA那么程序B就不能再去消费topicA程序A和程序B属于一个消费组再比如程序A已经消费了topicA里面的数据现在还是重新再次消费topicA的数据是不可以的但是重新指定一个group id号以后可以消费。不同消费组之间没有影响消费组需自定义消费者名称程序自动生成独一无二。
此时有两个消费者三个分区该如何分配呢
在 Kafka 中一个消费者组Consumer Group可以由多个消费者组成。当消费者组订阅一个主题Topic时Kafka 会自动将主题的分区分配给消费者组中的消费者。
对于一个消费者组中的多个消费者它们不需要手动指定分区。Kafka 使用一种分区分配策略来确保每个分区只被一个消费者消费。默认情况下Kafka 使用的是范围分配Range Assignment策略。
在范围分配策略下每个消费者被分配一定范围的分区。例如有一个主题有三个分区Partition 0、Partition 1、Partition 2消费者组中有两个消费者Consumer A 和 Consumer B分配可能如下
Consumer A 被分配 Partition 0 和 Partition 1 Consumer B 被分配 Partition 2 这种自动的分区分配机制使得消费者组能够 并行 地处理消息提高整体的消费吞吐量。
需要注意的是如果消费者组中的消费者数量发生变化分区的分配会动态调整以适应新的消费者数量而无需手动干预。 Kafka会在有新的消费者加入或者有消费者退出时自动重新平衡分区。这种自动的分区调整机制是 Kafka 提供的一项强大的功能能够使得整个系统更加灵活和容错。
3 Kafka 如何保证消息的消费顺序
消费后会提交偏移量
示例生产者提供了5条消息暂且按照上述方式分配消息。当消费者组 消费的时候会出现这种情况
0:01时刻 张三消费c并提交offset 李四消费b并提交offset 重新动态匹配 消费者和分区这里暂且忽略 0:02时刻 张三消费a并提交offset 李四消费e并提交offset
此时消费的顺序是 c,b----a,e 期待的消费顺序是a–b—c—d----e
因此是乱序的需要重新设计方案解决
3.1 方案一
若是只有一个分区这样就可以保证消费顺序了a–b—c—d----e 3.2 方案二 指定消息全存在某一个分区 如何指定 Kafka 中发送 1 条消息的时候可以指定 topic, partition, key,data数据 4 个参数。如果你发送消息的时候指定了 Partition 的话所有消息都会被发送到指定的 Partition。并且同一个 key 的消息可以保证只发送到同一个 partition这个我们可以采用表/对象的 id 来作为 key 。
Topic 指定消息要发送到的主题。Partition 指定消息要发送到的分区。如果指定了分区那么所有的消息都会被发送到这个分区。Key 通常用于确定消息应该被发送到哪个分区。如果你使用相同的 keyKafka 会根据 key 使用分区器Partitioner将具有相同 key 的- 消息发送到同一个分区。Value 实际的消息内容。
Key是用于计算消息应该被分配到哪个分区的依据而Partition是直接指定分区
4 消息积压
4.1 方案一
场景描述
Kafka 主题orders2个分区初始状态有一个消费者组Consumer Group中有一个消费者实例Consumer Instance用于处理订单消息。积压情况由于订单数量激增导致 orders 主题中的消息积压。
增加消费者
以前消息被分发到2个分区但是只有一个消费者消费其中一个分区另外一个暂时搁置多创建一个消费者提高使用率。 这里有个细节项目执行后唯一的线程main线程----消费分区1无法做到同时控制另外一个消费者去消费分区2。看似消费者多了实际效率没变化。只能增加线程
增加线程
一个消费者占一个线程这样项目启动2个线程控制2个消费者kafka负载均衡自动分配一个消费者消费一个分区提高了效率
异步消费 (并不能处理消息积压
在系统中主线程调用 某个方法后这个方法先返回数据给主主继续执行自己的逻辑。而这个方法是异步的所以他可以在后台创建线程和消费者不会造成系统阻塞。