首先是安装kafka,请自行百度!
安装好后进入到bin目录 windows系统的话进入到bin/windows下,输入命令 kafka-server-start.bat …/config/server.properties 启动
然后配置springboot 工程,这里是springboot2.x
pom.xml里新增
application.yml 添加
//编写生产者类
public class KafkaProducer{
private static Logger logger = LoggerFactory.getLogger(KafkaProducer.class);
@Autowired
private KafkaTemplate kafkaTemplate;
/**
* 发送消息
* @param topic 主题
* @param data 消息内容
* */
public void send(String topic,Object data){
try{
//发送
ListenableFuture<SendResult<String, Object>> future = kafkaTemplate.send(topic,data);
//发送回调
future.addCallback(new ListenableFutureCallback<SendResult<String, Object>>() {
@Override
public void onFailure(Throwable throwable) {
logger.error("fail in send by cause:"+ throwable.getMessage());
}
@Override
public void onSuccess(SendResult<String, Object> stringObjectSendResult) {
/**
* 此处可根据业务需要编写业务代码
* */
logger.info("The message was sent successfully:"+ data);
}
});
}catch (RuntimeException e){
logger.error("exception in send by cause:"+ e.getMessage());
}
}
}
//消费者类
public class KafkaConsumer {
private static Logger logger = LoggerFactory.getLogger(KafkaConsumer.class);
/**
* 消费监听
* */
@KafkaListener(topics=“test”)
public void listen(ConsumerRecord<String,String> record, Acknowledgment ack){
String message = record.value();
try {
logger.info("recevie message:" + message);
//提交offset
ack.acknowledge();
}catch (Exception e){
}
}
}
最后在记录一下学习心得
分区: 分区是kafka的物理数据存储位置,topic是逻辑存储。创建一个topic,其实就是在每个分区都创建了相同的topic, 分区可在server.properties中设置 num.partitions=8 就是设置了8个分区,那么发送数据具体到那个分区呢?
默认的分区策略是:
如果在发消息的时候指定了分区,则消息投递到指定的分区
如果没有指定分区,但是消息的key不为空,则基于key的哈希值来选择一个分区
如果既没有指定分区,且消息的key也是空,则用轮询的方式选择一个分区
每个分区同时只能由相同用户组的中其中一个消费者来消费,如果是要配置多消费者,则需要配置多个消费组
如果同一用户组的不同消费者消费不同的分组,如果消费者与分区相同,那是最好不过了,如果消费者实例的数量大于分区数,那么按照默认的策略,有一些消费者是多余的,一直接不到消息而处于空闲状态。
副本: 副本就相当于备份,副本数量不能超过borker数量,。如果副本数与borker相同,则每个borker都会存在一个副本,以保证服务的可用性