Kafka应用Demo:生产者自定义消息分区方法

背景

 没有设置消息键时Kafka默认的分区算法是轮循,设置了消息键将按消息键的hashcode计算分区值。这种方法可以保证未设置消息键时各分区负载均衡。也可以保证设置消息键后的消息放到同一个分区发送,以保证消息按顺序消费。

 但在某些业务场景下,我们可能也想要自定义分区算法。Producer端的配置支持做这样的自定义。

实现Partitioner接口,定义自己的算法

 下面以一个简单的例子举例,要求key为Tom的消息放1号分区,key为Alice的消息放2号分区。实际项目使用什么样的分区算法需要根据业务场景来决定。

java 复制代码
/**
 * 自定义分区算法
 *
 * @author neo
 * @since 2024-05-10
 */
public class NeoPartitioner implements Partitioner {
    // 分区数量
    private static final int PARTITION_NUM = 5;

    private RoundRobinPartitioner roundRobinPartitioner = new RoundRobinPartitioner();

    @Override
    public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
        if (key == null || "".equals(key)) {
            // 未指定分区键,使用轮循分区(指定了key的消息不参与轮循)
            return roundRobinPartitioner.partition(topic, key, keyBytes, value, valueBytes, cluster);
        }

        // 基于业务的约定. 某些消息放到固定的分区
        if ("Tom".equals(key)) {
            return 1;
        }

        if ("Alice".equals(key)) {
            return 2;
        }

        // 其它情况按key的哈希值分区
        int keyCode = key.hashCode();
        return keyCode % PARTITION_NUM;
    }

    @Override
    public void close() {

    }

    @Override
    public void configure(Map<String, ?> map) {

    }
}

Producer参数配置

相关推荐
螺蛳粉 螺蛳粉1 小时前
CDH第七篇:CDH 集成 Kafka 实战:CSD + Parcel 组合拳,先装 ZooKeeper 是铁律
物联网·zookeeper·kafka·消息队列·parcel·cdh集成·csd
每天一道题3 小时前
分布式锁真的安全吗?从 Redis 锁、Lease 到 Fencing Token
redis·分布式·安全
小O的算法实验室7 小时前
IEEE TAES,多无人机通信故障下的分布式任务分配与压制干扰
分布式
Deng桑1 天前
分布式锁与幂等
分布式
Flynn Liang1 天前
物联网时序数据乱序问题全链路治理:从设备到存储的五层实战(附 Flink/Kafka/IoTDB 配置级代码)
flink·kafka·iot·iotdb·emqx·乱序·时序数据
wifi___1 天前
Redis分布式锁
数据库·redis·分布式
方方洛1 天前
ray教程-15-RayServe与LLM服务
人工智能·分布式·机器学习
m0_639906941 天前
MySQL 实现分布式锁:悲观锁、乐观锁、唯一索引锁
数据库·分布式·mysql
T量子永生1 天前
Android SISO 分布式编译集群配置方案
android·分布式·云计算·源代码管理
starzy19902 天前
Kafka响应发送:字节是怎么真正写回客户端的
大数据·kafka