集群下的kafka实现多线程消费

Kafka网络通信模型 开发人员可以使用Kafka提供的客户端库来实现自定义的生产者和消费者应用程序,并根据实际需求进行配置和调优。在Kafka的架构中,网络通信模型起着关键的作用,它负责实现消息的传输和交互。本文将详细介绍Kafka的网络通信模型,并提供相应的源代码示例。消费者可以以消费者组(Consumer Group)的形式组织,每个消费者组可以有多个消费者实例,每个消费者实例负责消费一个或多个分区中的消息。在上述示例代码中,我们创建了一个消费者实例,将其分配给特定的主题和分区,并循环地从Kafka集群中拉取消息进行消费。 阅读详情

上一篇文章讲述了如何部署kafka集群,而这篇文章则来探讨一下如何使用多线程消费,提高消费能力,保障数据的时效性。而实现多线程消费其实很简单,只需要三步即可:
一:kafka集群配置

多线程消费,说白了就是多区消费,kafka可以给topic设置多个partition,从而实现生产的时候提交到不同的分区,以减少统一区块的压力。而消费则是从不同的分区里拿数据进行消费。

1.首先修改server.properties里:
num.partitions=3
这里等于3是因为本人的集群是用了三台机子,也就是3个broker,所以设置成3,具体数值可以根据集群情况设置。
2.创建topic:
bin/kafka-topics.sh –create –zookeeper 192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181 –replication-factor 3 –partitions 3 –topic test
这里的3对应上面的配置里的num.partitions=3
3.查看topic信息:
./kafka-topics.sh –zookeeper 192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181 –topic test–describe
会有如下显示表示创建成功:
Topic:test PartitionCount:3 ReplicationFactor:3 Configs:
Topic: test Partition: 0 Leader: 2 Replicas: 2,0,1 Isr: 0,1,2
Topic: test Partition: 1 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
Topic: test Partition: 2 Leader: 1 Replicas: 1,2,0 Isr: 0,1,2
二:生产者随机分区提交数据

这也是一个比较关键步骤,只有随机提交到不同的分区才能实现多分区消费;
这里借用了一片代码,自定义随机分区:

public class MyPartition implements Partitioner{
     private static Logger LOG = LoggerFactory.getLogger(MyPartition.class);
    @Override
    public void configure(Map<String, ?> arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void close() {
        // TODO Auto-generated method stub
    }

    @Override
    public int partition(String topic, Object key, byte[] keyBytes, Object value,
            byte[] valueBytes, Cluster cluster) {
        List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
        int numPartitions = partitions.size();
        int partitionNum = 0;
        try {
            partitionNum = Integer.parseInt((String) key);
        } catch (Exception e) {
            partitionNum = key.hashCode() ;
        }
//        System.out.println("kafkaMessage topic:"+ topic+" |key:"+ key+" |value:"+value);
        return Math.abs(partitionNum  % numPartitions);
    }
}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

然后在初始化kafka生产者配置的时候修改如下配置

props.put("partitioner.class", properties.getProperty("com.mykafka.MyPartition"));

    1

这样就实现了kafka生产者随机分区提交数据。
三:消费者

最后一步就是消费者,修改单线程模式为多线程,这里的多线程实现方式有很多,本例知识用了最简单的固定线程模式:

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 3; i++) {
            fixedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    kafkaConsumerService.getInstance();
                }
            });
        }

    1
    2
    3
    4
    5
    6
    7
    8
    9

在消费方面得注意,这里得遍历所有分区,否则还是只消费了一个区:

        ConsumerRecords<String, String> records = consumer.poll(1000);
        for (TopicPartition partition : records.partitions()) {  
            List<ConsumerRecord<String, String>> partitionRecords = records  
                    .records(partition);
        for (ConsumerRecord<String, String> record : partitionRecords) {
            System.out.println(
                    "message==>key:" + record.key() + " value:" + record.value() + " offset:" + record.offset()
                    + " 分区:" + record.partition());
            if (record.value() == null || record.key() == null) {
                consumer.commitSync();
            } else {
                // dealMessage
                KafkaServer.dealMessage(record.key(),record.value(),consumer);
//              consumer.commitSync();
            }
         }
        }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

注意上面的线程为啥只有3个,这里得跟上面kafka的分区个数相对应起来,否则如果线程超过分区数量,那么只会浪费线程,因为即使使用3个以上的线程也只会消费三个分区,而少了则无法消费完全。所以这里必须更上面的对应起来。
至此,多线程消费就已经完毕。这也只是本人摸索以及借鉴的经验,如有错误或者问题,请留言交流,互相学习。

---------------------
作者:Joker-pan
来源:优快云
原文:https://blog.youkuaiyun.com/u011622226/article/details/72500713
版权声明:本文为博主原创文章,转载请附上博文链接!

数据存储优化:Kafka+MongoDB分片,爬虫异步写入速度达3000条/秒 本文通过Kafka+MongoDB分片的架构,实现了爬虫数据的异步写入,将写入速度提升至3000条/秒以上。解耦:Kafka作为消息队列,将爬虫的生产与存储的消费解耦,避免同步阻塞;并行:Kafka的分区机制和MongoDB的分片机制,实现了数据的并行生产、消费和写入;批量:批量发送、批量消费、批量插入,减少IO次数,提升整体性能。 阅读详情

相关推荐

Xilinx同步FIFO IP核的两种读模式对比:Standard vs FWFT(附Vivado仿真代码)

本文深入解析Xilinx同步FIFO IP核的两种读模式——Standard与FWFT,通过时序仿真和Vivado代码示例对比其性能差异。Standard模式适合严格流水线设计,而FWFT模式在低延迟场景表现更优。文章包含详细的testbench搭建指南和性能实测数据,帮助FPGA工程师优化数据流设计。

table的专栏 348

集群上实现多线程

集群上实现多线程 我是用的map函数 def function(arg): print(‘arg’) map(function,(arg1,arg2,)) 这里要注意的是 function就是要调用的函数,arg1和arg2是function函数的参数,需要以元组形式传入,这个元组就类似于一个迭代器,相当于同时执行以arg1 arg2为参数的function ...

heishanlaoniu的博客 827

别再只看K线了!聊聊“板块联动”和“热点轮动”的跟踪方法与工具(实战派分享)

本文深入解析了如何通过板块联动和热点轮动构建高效交易系统。从三维验证框架到主流工具配置,再到持续性热点的五大特征,实战派交易员分享了识别市场主线和预判轮动方向的高阶技巧,帮助投资者摆脱单纯依赖K线的局限,提升交易决策效率。

weixin_29281941的博客 760

kafka 配置多台消费端,只有2个消费者可以消费

原因: 查看 这个 topic 有几个 partition (分区),如果只有2个partition,那么就只有2他配置消费者的机器可以进行消费。

mhbsoft的博客 3356

首个基于LBS方案的3D传感器,VoxelSensor解析

该传感器将结合OQmented的Lissajous模式的MEMS扫描镜,与每帧逐行工作的光栅扫描相比,Lissajous轨迹扫描速度更快,并且能耗很低,它可以更快地捕获完整的场景和快速移动,并且需要更少的数据处理,可满足AR/VR对于低延迟、高效率的需求。简单来讲,Switching Pixels的区别是专注于识别激光事件,性能比普通事件相机更好,但也可以使用事件相机的算法。在具体应用中,它需要在X和Y方向发射一个或多个脉冲光束,以在X和Y轴上定位,而Z轴,也就是深度,则是通过计算光返回的时间来测量。

qingtingwang的博客 576

RK3568下YT8531/YT8521 PHY移植避坑指南:RGMII与设备树详解

嵌入式Linux网络调试中,PHY芯片作为MAC与物理介质之间的桥梁,其驱动配置直接影响网络稳定性。RGMII接口的延时补偿、PHY地址设定以及复位时序是设备树配置中的关键环节,稍有差错便会出现链路已通却无法通信的现象。通过理解PHYLIB框架与mdio总线枚举原理,开发者可以快速定位寄存器级故障。在RK3568等工业级平台中,裕太微YT8531/YT8521凭借高性价比与内核主线支持,成为替代传统方案的热门选择。从设备树模板、内核配置到常见坑点,系统梳理千兆以太网PHY的移植与调试方法,帮助开发者少走弯路

weixin_29189381的博客 215

KAFKA学习

kafka学习

wanghuahu123的博客 5525

如何用 OBProxy 实现 OceanBase 的最佳路由策略

本文基于业务中一类常见的路由问题展开,对OceanBase的路由功能及对应配置项做详细介绍,指导用户在业务实践中如何正确的配置路由策略及快速排查路由问题

OceanBase分布式数据库的博客 1695

Kafka-多线程消费及分区设置

设置kafka消费实例数量,实现多线程消费

qq_36782325的博客 3749

告别电源纹波!手把手教你用UCC28019设计一个高效率PFC模块(附完整原理图与BOM清单)

本文详细介绍了如何使用UCC28019设计高效率PFC模块,解决电源纹波问题。通过优化补偿网络、关键元器件选型及PCB布局,实现功率因数提升至0.99以上,降低输入电流谐波。附完整原理图与BOM清单,适用于电赛等快速开发场景。

weixin_42652674的博客 338

BugkuCTF-PWN题pwn2-overflow超详细讲解

解题思路 1)计算出get_shell_的地址偏移量 2)算出来之后就直接溢出到后门函数 知识点 x64函数调用规则 解题之前我们先学下linux x64的函数调用规则。 x64机器在调用某个函数前,比如int func(int a, int b, int c, int d, int e, int f, int g, int h),首先他会把前6个参数从左往右存入到寄存器rdi、rsi、rdx、rcx、r8、r9,其余参数存入到栈里,保存的顺序是从右往左入栈。比如abcdef会存入到寄存器里,然后一次入栈h

am_03的博客 3014

Kafka 批量消费

业务背景项目有个需求需要统计IM聊天相关数据,原设计思想是在聊天产生时通过消息队列进行数据记录,利用rocketMQ实现。上线后发现由于内部IM活跃用户量级较大,MQ生产者生产消息过多,消费者实时消费会造成服务器CPU和硬盘读写压力,在改不了硬件配置的情况下,笔者通过了解到kafka批量消费的实现可解决这个问题,记录下该方案。

weixin_47648825的博客 1万+

华为OD机试双机位C卷-魔法收积木 (C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【魔法收积木】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为od - 魔法收积木。

qq_45776114的博客 1941

kafka中消费者消费消息之每个线程维护一个KafkaConsumer实例

1、首先启动自己的kafka集群哟。 1 启动zk: 2 bin/zkServer.sh start conf/zoo.cfg。 3 验证zk是否启动成功: 4 bin/zkServer.sh status conf/zoo.cfg。 5 启动kafka: 6 bin/kafka-server-start.sh -daemon config/server.properties。 ...

weixin_30739595的博客 159

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

kafka多线程

单线程问题主要出现在导入包上,多线程主要注意处理方法 package com.zkdj.kafka.common.config; import java.util.HashMap; import java.util.Map; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.producer.ProducerConfig; import org.springframewor

My_SweetXue的博客 1227

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

深度剖析 Kafka/RocketMQ 顺序消息的暗礁与突围

经过这篇文章的分析后,尝试回答读者的问题:1、生产端:1)生产端必须保证单线程同步发送,将顺序消息发送到同一个分区(当然如果发生了文中所描述的 Kafka 集群中意外情况,还是有可能会打乱消息的顺序,因此无论是 Kafka 还是 RocketMQ 都无法保证严格的顺序消息);2、消费端:2)多分区的情况下:如果想要保证 Kafka 在消费时要保证消费的顺序性,可以使用每个线程维护一个 KafkaConsumer 实例,并且是一条一条地去拉取消息并进行消费(防止重平衡时有可能打乱消费顺序);

2401_87878486的博客 963

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java 使用kafka教程_kafka java 基本使用

maven依赖:org.apache.kafkakafka_2.110.9.0.0kafka producer连接,注意import:import java.util.Properties;import org.apache.kafka.clients.producer.ProducerRecord;import config.Configloader;import config.MsgCreat...

weixin_32642109的博客 1132

rocketmq python消息堆积怎么办_阿里技术:深度剖析 Kafka/RocketMQ 顺序消息的一些坑...

我不记得有多少人问过以下这个问题了:我觉得这个问题问得很频繁,而且非常经典,在这里我就以 Kafka 为例子,说说我对 Kafka 顺序消息的一些理解吧,如有理解不对的地方麻烦留言指点一下。通常我们在说顺序消费指的是生产者按照顺序发送,消费者按照顺序进行消费,听起来简单,但做起来却非常困难。我们都知道无论是 Kafka 还是 rocketMQ,每个主题下面都有若干分区(rocketMQ 叫队列),...

weixin_39904587的博客 177

kafka 梳理

?如何实现kafka仅发送一次不重复,加pid,sequence,幂等性 kafka 定义: 一种高吞吐的分布式消息队列系统,特点是生产者消费者模式,保证先进先出,依靠group管理进行消费组管理,多个partition 集群: producer broker 负责读写存 consumer zookeeper 存储消费偏移量broker发送offset,consumer消费offset topic,partition等元数据 kafka内部 Topic分很多partition,.

dchdd的博客 142

kafka消息demo的java实现

package com.bus365.kafka; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.Executor

zhangweigangweiwu的专栏 619

kafka简记

专注于吞吐量的mq. 组成: 1.zookeeper 集群化 2.broker 集群化 3.producer 4.consumer 消息发送流程: 消息–>写入到按分区的缓存–>sender任务执行–>批量发送(合并请求提高吞吐量) 生产者使用模式: 1.多线程单个生产者,使用简单 2.多线程多生产者 消费者模式: 1.多消费者模式可自动ack 2.全局消费者,多work模式,手...

strive____的博客 156

python推送数据到kafka的kerberos服务验证(ubuntu)

1. 安装必要的依赖包 apt-get install krb5-kdc libkrb5-dev python3-six -y --fix-missing pip3 install gssapi==1.6.6 kafka-python==2.0.1 -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com 2. 获取必要的配置文件krb5.conf、kafka.keytab、jaas.conf放到/etc目录

旷古的寂寞的博客 1127

kafka 汇总

部署以及简单介绍 kafka的简单介绍以及docker-compose部署单主机Kafka集群 Java原生API kafka客户端操作之Admin API kafka 客户端之producer API发送消息以及简单源码分析 kafka 客户端之producer API发送消息(自定义负载均衡实现)与负载均衡调用源码分析 Kafka producer的事务和幂等性 kafka Java客户端之 consumer API 消费消息 kafka Java客户端之 consumer API 多线程消费消息 ka

小灰狼与大白兔的博客 5700

BAT面试文档:如何做到操作系统和并发同步结合?下载量瞬秒百万

什么是分布式锁?在回答这个问题之前,我们先回答一下什么是锁。 普通的锁,即在单机多线程环境下,当多个线程需要访问同一个变量或代码片段时,被访问的变量或代码片段叫做临界区域,我们需要控制线程一个一个的顺序执行,否则会出现并发问题。 如何控制呢?就是设置一个各个线程都能看的见的标志。然后,每个线程想访问临界区域时,都要先查看标志,如果标志没有被占用,则说明目前没有线程在访问临界区域。如果标志被占用了,则说明目前有线程正在访问临界区域,则当前线程需要等待。 这个标志,就是锁。 在单机多线程的java程序中,我们可

m0_56530263的博客 86
上一篇: Tomcat修改service.xml性能调优 增加最大并发连接数
java_wwwww
博客等级 码龄9年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值