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参数配置

相关推荐
Jack_David3 小时前
Kafka批量消息发送
java·分布式·kafka
wanhengidc4 小时前
服务器托管对企业的作用
大数据·运维·服务器·分布式·智能手机
Code知行合壹4 小时前
Spark使用总结
大数据·分布式·spark
Swift社区4 小时前
分布式能力不是功能,而是一种架构约束
分布式·架构
0xDevNull4 小时前
Apache Kafka 完全指南
分布式·kafka
zb200641205 小时前
RabbitMQ 客户端 连接、发送、接收处理消息
分布式·rabbitmq·ruby
半桶水专家6 小时前
Kafka JMX详解
分布式·kafka
渔民小镇6 小时前
告别 if-else 地狱 —— JSR380 参数验证在 ionet 中的应用
java·服务器·分布式·游戏
智慧科技的海洋7 小时前
微电网智慧平台:破解能源困局的分布式能源革命
分布式·能源
深蓝轨迹7 小时前
Redisson 分布式锁复习总结
分布式