kafka是一种消息队列框架。
如果不用消息队列框架,就需要用阻塞队列来实现发送系统消息和系统通知
1.阻塞队列
阻塞队列是一种用来解决进程间通信的方式
阻塞队列依靠自带的两个方法put(往队列里面存数据)和take(从队列里面取数据)
2.Kafka
有多个Broker,每个Broker中有很多Topic,对Topic进行分区,分成Partition1,Partition2,Partition3......,比如第0-99条消息放到Partition1,第100~199条消息放到Partition2,第200~299条消息放到Partition3.........Partition是真正保存消息的地方
Partition中的每条消息都有自己的offset索引
同一Topic的Partition可以分布在不同的Broker上,每个Partition可以有多个副本(备份),也就是主从复制,Leader和Follower,以此来实现高可用,Leader一旦挂掉,Follower就顶上去
3.springboot 整合kafka
step1:引入spring-kafka的依赖
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.9.0</version>
</dependency>
step2: 在application.properties文件中对kafka进行配置
spring.kafka.bootstrap-servers=localhost:9092
spring.kafka.consumer.group-id=community-consumer-group
spring.kafka.consumer.enable-auto-commit=true
#自动提交频率
spring.kafka.consumer.auto-commit-interval=3000
测试:生产者生产一个东西,看消费者是否能够自动接收到这个东西
核心:
生产者往某个topic中发送消息
kafkaTemplate.send(topic,content);
消费者监听某个topic:
@KafkaListener(topics={"test"}) //监听哪个topic
//生产者
@Component
class KafkaProducer
{
@Autowired
private KafkaTemplate kafkaTemplate;
public void sendMessage(String topic,String content)
{
kafkaTemplate.send(topic,content);//往哪个topic里面发送什么消息
}
}
//消费者
@Component
class KafkaConsumer
{
@KafkaListener(topics={"test"}) //监听哪个topic
public void handleMessage(ConsumerRecord record)
{
System.out.println(record.value() );
}
}
@SpringBootTest
class EmsVueApplicationTests
{
@Autowired
private KafkaProducer kafkaProducer;
@Test
public void testKafka() throws InterruptedException {
kafkaProducer.sendMessage( "test" ,"你好");
kafkaProducer.sendMessage( "test" ,"在吗");
Thread.sleep(1000*10);
}
}
4.实战:使用kafka给用户发送通知
当有别的用户评论你的帖子,要给用户发送通知
当有别的用户给你的帖子点赞了,也要给用户发送通知
当有别的用户关注了你,也要给用户发送通知
可以把评论,点赞,关注分别设置成一个topic
这三个topic里面的消息最终都是要往message表里面插入一条数据,表示给用户发送消息