kafka partition java,kafka中partition数量与消费者对应关系以及Java实践

kafka中partition数量与消费者对应关系以及Java实践

kafka中partition数量与消费者对应关系以及Java实践

kafka是由Apache软件基金会开发的一个开源流处理平台。kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。

kafka中partition类似数据库中的分表数据,可以起到水平扩展数据的目的,比如有a,b,c,d,e,f 6个数据,某个topic有两个partition,一般情况下partition-0存储a,c,e3个数据,partition-1存储b,d,f另外3个数据。

消费者组数量的不同以及partition数量的不同对应着不同的消费情况,下面分别进行梳理之:

1、单播模式,只有一个消费者组

(1)topic只有1个partition,该组内有多个消费者时,此时同一个partition内的消息只能被该组中的一个consumer消费。当消费者数量多于partition数量时,多余的消费者是处于空闲状态的,如图1所示。topic,test只有一个partition,并且只有1个group,G1,该group内有多个consumer,只能被其中一个消费者消费,其他的处于空闲状态。

d0fbcaee7c2faea6523f721ff61bb588.png

图1

(2)该topic有多个partition,该组内有多个消费者,比如test 有3个partition,该组内有2个消费者,那么可能就是C0对应消费p0,p1内的数据,c1对应消费p2的数据;如果有3个消费者,就是一个消费者对应消费一个partition内的数据了。图解分别如图2,图3.

46af8d941e927ffb9f0191b9d5888819.png  

26487c81136e6a7c00b9afcbc1cff4a0.png

图2                                                                                    图3

2、广播模式,多个消费者组

如果想实现广播的模式就需要设置多个消费者组,这样当一个消费者组消费完这个消息后,丝毫不影响其他组内的消费者进行消费,这就是广播的概念。

(1)多个消费者组,1个partition

该topic内的数据被多个消费者组同时消费,当某个消费者组有多个消费者时也只能被一个消费者消费,如图4所示:

8871bc8766ea2a5c8b3698001874bb74.png

图4

(2)多个消费者组,多个partition

该topic内的数据可被多个消费者组多次消费,在一个消费者组内,每个消费者又可对应该topic内的一个或者多个partition并行消费,如图5所示:

d1e8583df320726aa390f7598c26fcb2.png

图5

3、Java实践

这里使用Java服务进行实践,模拟2个parition,然后同一个组内有2个消费者的情况:

首先创建一个发送消息的controller方法:

@ApiOperation(value = "向具有kafka-2个partition的topic发送信息")

@RequestMapping(value = "/testSendMessage2", method = RequestMethod.POST)

public String testSendMessage(@RequestParam("msg") String msg) {

KafkaTemplate.send(KafkaTopicEnum.TEST_TWO_PARTITION_MSG.code,msg);

System.out.println("发送的消息是:"+msg);

return "2个partition的topic数据!--ok";

}

然后再创建一个监听类监听该topic,这里的监听类即为消费者。

/**

* @date 2020-09-24

* 两个partition的topic,同一个组的两个消费者就可以并行的消费了,需要kafka也是集群才行,单机版并不支持

* @param consumerRecord

* @param acknowledgment

*/

@KafkaListener(topics = "two-partition-msg",groupId ="serverGroup1",containerFactory = "ackContainerFactory")

public void receiveKafkaTwoParMsg(ConsumerRecord,?> consumerRecord, Acknowledgment acknowledgment){

InetAddress address = null;

try {

address = InetAddress.getLocalHost();

} catch (UnknownHostException e) {

e.printStackTrace();

}

System.out.println("当前的IP地址是:"+address.getHostAddress());

System.out.println("监听服务A-收到的消息是::");

System.out.println(consumerRecord.value().toString());

System.out.println("=================== end =================");

// ack 提交掉,避免服务重启再次拉取到消息

acknowledgment.acknowledge();

}

然后我们给该服务起2个实例,即模拟该组内serverGroup1内的2个消费者,然后我们使用测试方法进行测试,向该topic内发送多个消息,观察2个实例的输出日志:

实例1:

发送的消息是:111

当前的IP地址是:10.244.3.114

监听服务A-收到的消息是::

"111"

=================== end =================

发送的消息是:222

发送的消息是:333

当前的IP地址是:10.244.3.114

监听服务A-收到的消息是::

"333"

=================== end =================

发送的消息是:444

发送的消息是:555

当前的IP地址是:10.244.3.114

监听服务A-收到的消息是::

"555"

=================== end =================

发送的消息是:666

发送的消息是:777

当前的IP地址是:10.244.3.114

监听服务A-收到的消息是::

"777"

=================== end =================

发送的消息是:888

发送的消息是:999

当前的IP地址是:10.244.3.114

监听服务A-收到的消息是::

"999"

实例2:

当前的IP地址是:10.244.0.237

监听服务A-收到的消息是::

"222"

=================== end =================

当前的IP地址是:10.244.0.237

监听服务A-收到的消息是::

"444"

=================== end =================

当前的IP地址是:10.244.0.237

监听服务A-收到的消息是::

"666"

=================== end =================

当前的IP地址是:10.244.0.237

监听服务A-收到的消息是::

"888"

发现该组内的一个消费者消费到了111,333,555,777,999 ,另外一个消费者消费到了222,444,666,888,起到了均衡消费的效果。

所以在微服务的集群中,我们可以通过给topic设置多个partition,然后让每一个实例对应消费1个partition的数据,从而实现并行的处理数据,可以显著地提高处理消息的速度。

kafka中partition数量与消费者对应关系以及Java实践相关教程

【leetcode.200】岛屿数量

【leetcode.200】岛屿数量 给你一个由'1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。 示例 1: 输入: [ [

IDEA打开窗口的数量及打开窗口的排列方式调整

IDEA打开窗口的数量及打开窗口的排列方式调整 IDEA打开窗口的数量及打开窗口的排列方式调整 在我们项目的开发过程中,由于项目涉及的类过多,以至于我们会打开很多的窗口。使用IDEA默认的配置,个人觉的十分不便。但我们可以对窗口的排列方式和打开窗口的排列

数量技术宅|金融数据分析系列分享如何正确抄底商品期货大宗商品

【数量技术宅|金融数据分析系列分享】如何正确抄底商品期货、大宗商品 往期干货分享推荐阅读 【数量技术宅|量化投资策略系列分享】股指期货IF分钟波动率统计策略 【数量技术宅 | Python爬虫系列分享】实时监控股市重大公告的Python爬虫

Kafka Docker安装配置

Kafka Docker安装配置 Docker常用命令 https://xiaolyuh.blog.csdn.net/article/details/72528860 下载docker镜像 docker pull wurstmeister/kafka docker pull wurstmeister/zookeeper 启动zk容器 docker run -d --name zookeeper -p 2181:2181 wurstmeister

bireme数据源同步工具--debezium+kafka+bireme

bireme数据源同步工具--debezium+kafka+bireme 1、介绍 Bireme 是一个 Greenplum / HashData 数据仓库的增量同步工具。目前支持 MySQL、PostgreSQL 和 MongoDB 数据源 官方介绍文档:https://github.com/HashDataInc/bireme/blob/master/README_zh-cn.md 1、

Kafka搭建

Kafka搭建 1.下载Kafka安装包 kafka官网 选着需要的版本 2.上传服务器并解压 tar xzvf kafka_2.11-2.0.0.tgz -C /data/elk/ 3.修改zookeeper配置 这里有点意思,在之前的kafka安装是需要自己下载zookeeper,后来kafka也就自己将zookeeper集成到kafka里面来了

聊聊kafka的group coordinator

聊聊kafka的group coordinator 为什么80%的码农都做不了架构师? 本文主要来讲一个kafka的group coordinator。在kafka0.9.0版本的时候,开始启用了新的consumer config,这个新的consumer config采用bootstrap.servers替代之前版本的zookeeper.connect,主要

kafka0.8生产者异常处理

kafka0.8生产者异常处理 为什么80%的码农都做不了架构师? 本文简单解析一下kafka0.8.2.2版本中的java producer的异常处理。 kafka的java producer的发送是异步,主要的分几步: append到RecordAccumulator sender从RecordAccumulator取出RecordBatch,交给cl

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值