📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)、《解密程序员的思维密码——沟通、演讲、思考的实践》作者、清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。
📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。
📙不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

🍊 Kafka知识点之 Sticky 分区分配策略:概述
在分布式系统中,尤其是在使用Kafka进行大数据处理时,如何高效且公平地将消息分配到各个分区是一个关键问题。假设我们有一个高并发的Kafka集群,多个生产者同时向同一个主题发送消息,如果分区分配策略不当,可能会导致某些分区负载过重,而其他分区却几乎空闲。这种不均衡的负载分配不仅影响系统的整体性能,还可能引发数据丢失的风险。为了解决这一问题,Kafka引入了Sticky分区分配策略。
介绍Kafka知识点之Sticky分区分配策略的必要性在于,它能够确保消息在分区之间的分配更加均匀,从而提高系统的稳定性和性能。在分布式系统中,数据的一致性和可靠性至关重要,而Sticky分区分配策略正是为了实现这一目标而设计的。
接下来,我们将深入探讨Sticky分区分配策略的定义和目的。首先,我们将解释Sticky分区分配策略是如何工作的,即它如何确保消息在分区之间的分配是“粘性”的。随后,我们将阐述这一策略的目的,即为什么Kafka要采用这种分配方式,以及它如何帮助实现更均衡的负载分配和更高的系统性能。通过这些内容,读者将能够全面理解Sticky分区分配策略在Kafka中的重要性,并学会如何在实际应用中利用这一策略来优化Kafka集群的性能。
🎉 Kafka 分区分配策略:Sticky 分区
📝 Sticky 分区定义
Sticky 分区是 Kafka 中一种特殊的分区分配策略。在 Kafka 中,生产者将消息发送到特定的主题,而主题可以由多个分区组成。Sticky 分区策略确保了消息在同一个生产者与消费者对之间,总是被发送到或消费自同一个分区。这种策略可以减少消息在分区之间的跳跃,从而提高消息的传输效率,并保证消息的顺序性。
📝 Sticky 分区与消息顺序保证
Sticky 分区策略与消息顺序保证密切相关。在 Kafka 中,为了保证消息的顺序性,通常会采用以下两种方法:
- 顺序分区:将消息发送到同一个分区,从而保证消息的顺序性。
- Sticky 分区:通过 Sticky 分区策略,确保消息在同一个生产者与消费者对之间,总是被发送到或消费自同一个分区,从而保证消息的顺序性。
| 方法 | 优点 | 缺点 |
|---|---|---|
| 顺序分区 | 简单易用,保证消息顺序性 | 限制了分区数量,可能导致资源浪费 |
| Sticky 分区 | 保证消息顺序性,提高资源利用率 | 需要配置 Sticky 分区策略,对生产者和消费者有一定要求 |
📝 Sticky 分区与负载均衡
Sticky 分区策略在一定程度上会影响负载均衡。由于 Sticky 分区确保了消息在同一个生产者与消费者对之间,总是被发送到或消费自同一个分区,因此可能会导致其他分区负载不均。
| 策略 | 优点 | 缺点 |
|---|---|---|
| Sticky 分区 | 保证消息顺序性,提高资源利用率 | 可能导致负载不均 |
| 负载均衡 | 资源利用率高,负载均衡 | 可能牺牲消息顺序性 |
📝 生产者消费者配置
为了使用 Sticky 分区策略,需要在生产者和消费者配置中启用该策略。
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("partitioner.class", "org.apache.kafka.clients.producer.internals.DefaultPartitioner");
props.put("client.id", "producer-1");
props.put("retries", 0);
props.put("linger.ms", 1);
props.put("batch.size", 16384);
props.put("buffer.memory", 33554432);
props.put("enable.idempotence", true);
props.put("max.block.ms", 60000);
props.put("max.request.size", 1048576);
props.put("request.timeout.ms", 30000);
props.put("transactional.id", "transactional_id");
props.put("inter.broker.protocol.version", "2.8.0");
props.put("security.protocol", "SASL_SSL");
props.put("sasl.mechanism", "SCRAM-SHA-256");
props.put("sasl.jaas.config", "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"admin\" password=\"admin-secret\";");
props.put("ssl.truststore.location", "/path/to/truststore.jks");
props.put("ssl.truststore.password", "truststore-password");
props.put("ssl.keystore.location", "/path/to/keystore.jks");
props.put("ssl.keystore.password", "keystore-password");
props.put("ssl.key.password", "key-password");
props.put("producer.type", "async");
props.put("acks", "all");
props.put("retry.backoff.ms", 1000);
props.put("max.in.flight.requests.per.connection", 1);
props.put("enable.auto.commit", false);
props.put("auto.offset.reset", "earliest");
props.put("auto.commit.interval.ms", 1000);
props.put("max.partition.fetch.bytes", 1048576);
props.put("max.request.size", 1048576);
props.put("receive.buffer.bytes", 33554432);
props.put("send.buffer.bytes", 33554432);
props.put("request.timeout.ms", 30000);
props.put("fetch.min.bytes", 1);
props.put("fetch.max.wait.ms", 100);
props.put("fetch.max.bytes", 52428800);
props.put("fetch.poll.interval.ms", 500);
props.put("connection.timeout.ms", 10000);
props.put("reconnect.backoff.ms", 1000);
props.put("reconnect.backoff.max.ms", 30000);
props.put("max.reconnect.attempts", 5);
props.put("session.timeout.ms", 10000);
props.put("heartbeat.interval.ms", 3000);
props.put("metadata.max.age.ms", 300000);
props.put("max.partition.fetch.bytes", 1048576);
props.put("max.request.size", 1048576);
props.put("receive.buffer.bytes", 33554432);
props.put("send.buffer.bytes", 33554432);
props.put("request.timeout.ms", 30000);
props.put("fetch.min.bytes", 1);
props.put("fetch.max.wait.ms", 100);
props.put("fetch.max.bytes", 52428800);
props.put("fetch.poll.interval.ms", 500);
props.put("connection.timeout.ms", 10000);
props.put("reconnect.backoff.ms", 1000);
props.put("reconnect.backoff.max.ms", 30000);
props.put("max.reconnect.attempts", 5);
props.put("session.timeout.ms", 10000);
props.put("heartbeat.interval.ms", 3000);
props.put("metadata.max.age.ms", 300000);
props.put("max.partition.fetch.bytes", 1048576);
props.put("max.request.size", 1048576);
props.put("receive.buffer.bytes", 33554432);
props.put("send.buffer.bytes", 33554432);
props.put("request.timeout.ms", 30000);
props.put("fetch.min.bytes", 1);
props.put("fetch.max.wait.ms", 100);
props.put("fetch.max.bytes", 52428800);
props.put("fetch.poll.interval.ms", 500);
props.put("connection.timeout.ms", 10000);
props.put("reconnect.backoff.ms", 1000);
props.put("reconnect.backoff.max.ms", 30000);
props.put("max.reconnect.attempts", 5);
props.put("session.timeout.ms", 10000);
props.put("heartbeat.interval.ms", 3000);
props.put("metadata.max.age.ms", 300000);
props.put("max.partition.fetch.bytes", 1048576);
props.put("max.request.size", 1048576);
props.put("receive.buffer.bytes", 33554432);
props.put("send.buffer.bytes", 33554432);
props.put("request.timeout.ms", 30000);
props.put("fetch.min.bytes", 1);
props.put("fetch.max.wait.ms", 100);
props.put("fetch.max.bytes", 52428800);
props.put("fetch.poll.interval.ms", 500);
props.put("connection.timeout.ms", 10000);
props.put("reconnect.backoff.ms", 1000);
props.put("reconnect.backoff.max.ms", 30000);
props.put("max.reconnect.attempts", 5);
props.put("session.timeout.ms", 10000);
props.put("heartbeat.interval.ms", 3000);
props.put("metadata.max.age.ms", 300000);
props.put("max.partition.fetch.bytes", 1048576);
props.put("max.request.size", 1048576);
props.put("receive.buffer.bytes", 33554432);
props.put("send.buffer.bytes", 33554432);
props.put("request.timeout.ms", 30000);
props.put("fetch.min.bytes", 1);
props.put("fetch.max.wait.ms", 100);
props.put("fetch.max.bytes", 52428800);
props.put("fetch.poll.interval.ms", 500);
props.put("connection.timeout.ms", 10000);
props.put("reconnect.backoff.ms", 1000);
props.put("reconnect.backoff.max.ms", 30000);
props.put("max.reconnect.attempts", 5);
props.put("session.timeout.ms", 10000);
props.put("heartbeat.interval.ms", 3000);
props.put("metadata.max.age.ms", 300000);
props.put("max.partition.fetch.bytes", 1048576);
props.put("max.request.size", 1048576);
props.put("receive.buffer.bytes", 33554432);
props.put("send.buffer.bytes", 33554432);
props.put("request.timeout.ms", 30000);
props.put("fetch.min.bytes", 1);
props.put("fetch.max.wait.ms", 100);
props.put("fetch.max.bytes", 52428800);
props.put("fetch.poll.interval.ms", 500);
props.put("connection.timeout.ms", 10000);
props.put("reconnect.backoff.ms", 1000);
props.put("reconnect.backoff.max.ms", 30000);
props.put("max.reconnect.attempts", 5);
props.put("session.timeout.ms", 10000);
props.put("heartbeat.interval.ms", 3000);
props.put("metadata.max.age.ms", 300000);
props.put("max.partition.fetch.bytes", 1048576);
props.put("max.request.size", 1048576);
props.put("receive.buffer.bytes", 33554432);
props.put("send.buffer.bytes", 33554432);
props.put("request.timeout.ms", 30000);
props.put("fetch.min.bytes", 1);
props.put("fetch.max.wait.ms", 100);
props.put("fetch.max.bytes", 52428800);
props.put("fetch.poll.interval.ms", 500);
props.put("connection.timeout.ms", 10000);
props.put("reconnect.backoff.ms", 1000);
props.put("reconnect.backoff.max.ms", 30000);
props.put("max.reconnect.attempts", 5);
props.put("session.timeout.ms", 10000);
props.put("heartbeat.interval.ms", 3000);
props.put("metadata.max.age.ms", 300000);
props.put("max.partition.fetch.bytes", 1048576);
props.put("max.request.size", 1048576);
props.put("receive.buffer.bytes", 33554432);
props.put("send.buffer.bytes", 33554432);
props.put("request.timeout.ms", 30000);
props.put("fetch.min.bytes", 1);
props.put("fetch.max.wait.ms", 100);
props.put("fetch.max.bytes", 52428800);
props.put("fetch.poll.interval.ms", 500);
props.put("connection.timeout.ms", 10000);
props.put("reconnect.backoff.ms", 1000);
props.put("reconnect.backoff.max.ms", 30000);
props.put("max.reconnect.attempts", 5);
props.put("session.timeout.ms", 10000);
props.put("heartbeat.interval.ms", 3000);
props.put("metadata.max.age.ms", 300000);
props.put("max.partition.fetch.bytes", 1048576);
props.put("max.request.size", 1048576);
props.put("receive.buffer.bytes", 33554432);
props.put("send.buffer.bytes", 33554432);
props.put("request.timeout.ms", 30000);
props.put("fetch.min.bytes", 1);
props.put("fetch.max.wait.ms", 100);
props.put("fetch.max.bytes", 52428800);
props.put("fetch.poll.interval.ms", 500);
props.put("connection.timeout.ms", 10000);
props.put("reconnect.backoff.ms", 1000);
props.put("reconnect.backoff.max.ms", 30000);
props.put("max.reconnect.attempts", 5);
props.put("session.timeout.ms", 10000);
props.put("heartbeat.interval.ms", 3000);
props.put("metadata.max.age.ms", 300000);
props.put("max.partition.fetch.bytes", 1048576);
props.put("max.request.size", 1048576);
props.put("receive.buffer.bytes", 33554432);
props.put("send.buffer.bytes", 33554432);
props.put("request.timeout.ms", 30000);
props.put("fetch.min.bytes", 1);
props.put("fetch.max.wait.ms", 100);
props.put("fetch.max.bytes", 52428800);
props.put("fetch.poll.interval.ms", 500);
props.put("connection.timeout.ms", 10000);
props.put("reconnect.backoff.ms", 1000);
props.put("reconnect.backoff.max.ms", 30000);
props.put("max.reconnect.attempts", 5);
props.put("session.timeout.ms", 10000);
props.put("heartbeat.interval.ms", 3000);
props.put("metadata.max.age.ms", 300000);
props.put("max.partition.fetch.bytes", 1048576);
props.put("max.request.size", 1048576);
props.put("receive.buffer.bytes", 33554432);
props.put("send.buffer.bytes", 33554432);
props.put("request.timeout.ms", 30000);
props.put("fetch.min.bytes", 1);
props.put("fetch.max.wait.ms", 100);
props.put("fetch.max.bytes", 52428800);
props.put("fetch.poll.interval.ms", 500);
props.put("connection.timeout.ms", 10000);
props.put("reconnect.backoff.ms", 1000);
props.put("reconnect.backoff.max.ms", 30000);
props.put("max.reconnect.attempts", 5);
props.put("session.timeout.ms", 10000);
props.put("heartbeat.interval.ms", 3000);
props.put("metadata.max.age.ms", 300000);
props.put("max.partition.fetch.bytes", 1048576);
props.put("max.request.size", 1048576);
props.put("receive.buffer.bytes", 33554432);
props.put("send.buffer.bytes", 33554432);
props.put("request.timeout.ms", 30000);
props.put("fetch.min.bytes", 1);
props.put("fetch.max.wait.ms", 100);
props.put("fetch.max.bytes", 52428800);
props.put("fetch.poll.interval.ms", 500);
props.put("connection.timeout.ms", 10000);
props.put("reconnect_backoff.ms", 1000);
props.put("reconnect_backoff.max.ms", 30000);
props.put("max.reconnect.attempts", 5);
props.put("session.timeout.ms", 10000);
props.put("heartbeat.interval.ms", 3000);
props.put("metadata.max.age.ms", 300000);
props.put("max.partition.fetch.bytes", 1048576);
props.put("max.request.size", 1048576);
props.put("receive.buffer.bytes", 33554432);
props.put("send.buffer.bytes", 33554432);
props.put("request.timeout.ms", 30000);
props.put("fetch.min.bytes", 1);
props.put("fetch.max.wait.ms", 100);
props.put("fetch.max.bytes", 52428800);
props.put("fetch.poll.interval.ms", 500);
props.put("connection.timeout.ms", 10000);
props.put("reconnect_backoff.ms", 1000);
props.put("reconnect_backoff.max.ms", 30000);
props.put("max.reconnect.attempts", 5);
props.put("session.timeout.ms", 10000);
props.put("heartbeat.interval.ms", 3000);
props.put("metadata.max.age.ms", 300000);
props.put("max.partition.fetch.bytes", 1048576);
props.put("max.request.size", 1048576);
props.put("receive.buffer.bytes", 33554432);
props.put("send.buffer.bytes", 33554432);
props.put("request.timeout.ms", 30000);
props.put("fetch.min.bytes", 1);
props.put("fetch.max.wait.ms", 100);
props.put("fetch.max.bytes", 52428800);
props.put("fetch.poll.interval.ms", 500);
props.put("connection.timeout.ms", 10000);
props.put("reconnect_backoff.ms", 1000);
props.put("reconnect_backoff.max.ms", 30000);
props.put("max.reconnect.attempt

最低0.47元/天 解锁文章
1452

被折叠的 条评论
为什么被折叠?



