kafka:
安装这些都在网上,记得最新的springboot要使用最新的kafka,不然springboot自带的kafka会因为版本的原因发送不了消息
若只是简单的topic发送消息,消费者接收消息,则不需要使用kafka分区,。
也不需要初始化topic,直接书写kafkaTemplate.send("topic1", normalMessage)发送消息,这种情况就没有把该topic进行分区
zookeeper的启动命令
zkServer.sh start
zkServer.sh status
zkServer.sh restart
若是需要分区这种topic,就需要初始化topic。
两种方式: 注意:分区与线程数建议保持一致,这样不会漏掉,也不会多余
(1)第一种就在liunx服务器上面进行
./kafka-topics.sh --create --zookeeper 172.17.80.219:2181 --replication-factor 2 --partitions 2 --topic topic1 这是创建主题为topic1,默认分区为2,分区副本也是2
(2)在java代码里面初始化,创建一个初始化的类@Configuration,注入@Bean 有一个类叫:NewTopic ,这个类有构造方法入参:topic名称、分区数、分区副本数
return new NewTop("do_1",8,(short)2) 创建一个do_1的topic,分区为8,分区副本为2
还可以修改topic的默认分区,只需要再注入同一个topic,相当于修改。然后重启一下项目就可以了。
注意:修改的时候,topic分区只能增,不能减,不然会导致数据流失。
为什么要分区:分区能够减缓数据接收压力,采取轮询的模式,让每台服务器都能接收到数据。
分组:Kafka可以将消息复制并分发给所有consumer group(分组),但每个分组只有一个 consumer(消费者)能消费这条消息。
所以就出现了两种状况:
当所有consumer所在的consumer group名字相同时,系统变成队列模式。
当所有consumer所在的consumer group名字不同时,系统变成发布/订阅模式。