Java基于SpringBoot的牛客网社区项目实现详解(下)
上传篇幅有限,因此分为上下两部分,完整从零介绍牛客网项目的创建。不涉及到代码层面,仅介绍搭建逻辑过程。
文章目录
十一、Kafka消息队列
问:为什么要使用Kafka?
答:因为不管是Kafka也好还是阻塞队列也好,都是一种消息队列的框架,具有很好的封装性,都能实现这样的一个消息队列的功能,但是Kafka是目前性能最好的消息队列服务器,它能处理TB级别的海量数据,并且在我们的系统中评论、点赞、关注等等通知是十分频繁的,使用Kafka能保证一个最好的性能。
1. 阻塞队列
2. Kafka入门
Kafka的特点:
(1)高吞吐量。它处理数据的能力很强,能够处理海量的数据。其为何能如此之强,是由于下面这个特点。
(2)消息持久化。其可以将数据永久化的保留到某个介质里,类似于硬盘。也就是说其可以将数据存到硬盘上而不是内存里,硬盘的空间是要比内存大很多的,这就满足了处理海量数据的一个前提。但有的人要问了,存到硬盘中读取速度不是会变慢吗?这样不会影响性能吗?但实际上对硬盘数据的顺序读写的速度是要大于对内存数据的随机读取的。Kafka正是利用了这一点,对数据进行一个顺序读写,保证了一个很高的性能。
(3)高可靠。这是因为它是一个分步式的服务器,可以做集群部署,提高容错率。
(4)高扩展性。当当前服务器不够用时,可以直接进行添加,表现出高的扩展性。
启动步骤(项目应用只需要启动前两项即可):
启动zookeeper:bin\windows\zookeeper-server-start.bat config\zookeeper.properties
启动Kafka:bin\windows\kafka-server-start.bat config\server.properties
启动Kafka的topic,创建topic空间:kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
启动Kafka producer发送数据:kafka-console-producer.bat --broker-list localhost:9092 --topic test
启动Kafka consumer接收数据:kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning
3. Spring整合Kafka
访问Kafka时,生产者只需要利用spring封装工具KafkaTemplate发送数据,topic为指定的主题。消费者消费数据先要在对应的方法上加入注解以及要从哪个topic中拿数据,再用一个方法把数据取出来即可。
生产者发消息是主动去调的,消费者处理消息是被动自动去调的。
(1)mvn仓库中查找导入spring kafka依赖包。
(2)配置文件中对Kafka进行配置。包括:
# KafkaProperties
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
4. 发布系统通知
问:为什么要用到消息队列?
答:在项目中,针对评论、点赞、关注我们可以定义三类不同的主题,一旦当事情发生时我们就能将这个消息发送到队列里,然后就不用再去关注后面的操作,后续由专门的消费者去获取消息队列里面的消息,这个过程实际上是异步的,是一个并发的过程,保证了系统的性能。
简介:
拼一个对象,触发事件,处理事件。面向事件编程。
Entity实体类中编写消费者和生产者;
创建event包,专门处理,里面的eventproducer发送消息,eventconsumer处理消息;
Eventconsumer中,把从producer那边拿到的消息进行内容和格式的判断,之后发送站内通知,先设置发送者和接受者,为了获得发送的消息的具体内容,发送的消息的内容需要拼出,创这个hashmap(content),从event里面获取内容装进去,构造好消息,最后用messageservice塞进去;
给响应的controller调用eventproducer,产生通知。
实现步骤如下:
(1)首先在entity包下新建一个事件对象的实体类Event,包括主题、用户ID、实体类别、实体ID、数据等。
(2)对于事件的生产者与消费者,新建一个event包用于封装这两个对象的方法。首先是EventProducer生产者,包括一个将事件发送给消息队列的方法:
public void fireEvent(Event event) {
// 将事件发布到指定的主题
kafkaTemplate.send(event.getTopic(), JSONObject.toJSONString(event));
}
接着是EventConsumer消费者,在实体类CommunityConstant中加入主题:点赞、主题:评论、主题:关注。
利用消费者获取队列中的消息record,将record的数据给到之前定义的event类的实例,再对这个实例进行操作。
(3)修改之前点赞、评论、关注等等controller。触发事件之后,首先构造event实体,传入数据,接着调用生产者的方法以该实体为参数发送到消息队列中,再由专门的消费者去进行接受消费。