1,阻塞队列
-
BlockingQueue(Java核心API的接口)
解决线程通信的问题
阻塞方法:put(存数据)、take(拿数据)。
-
生产者消费者模式
生产者:产生数据的线程。
消费者:使用数据的线程。
-
实现类
ArrayBlockingQueue
LinkedlockingQueue
PriorityBlockingQueue、SynchronousQueue、DelayQueue等。
2.kafka
kafka是一个分布式的流媒体平台
应用:消息系统、日志收集、用户行为追踪、流式处理。
kafka特点:高吞吐量、消息持久化、高可靠性、高扩展性。
3.kafka入门安装启动
我使用的kafka版本为2.12-2.30
启动及入门请查看博客:kafka入门
springboot整合配置:pom引入,
#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
4.kafka应用
具体应用于发送系统通知
触发事件:
评论后,发布通知
点赞后,发布通知
关注后,发布通知
处理事件
封装事件对象
开发事件的生产者
开发事件的消费者
以事件为主体进行封装,事件驱动。
接下来进行实战应用,kafka将在我的一个简单的社区项目中应用,主要业务就是上面三种,评论、点赞、关注。三种操作逻辑基本相同,在数据获取上有小部分差别。
首先建立一个消息实体,定义kafka从生产者到消费者的传输数据格式
public class Event {
private String topic;//主题名称
private int userId;//用户id
private int entityType;//实体类型:点赞 评论 关注
private int entityId;//实体id
private int entityUserId;//实体拥有者id 比如文章发布者,发出评论的用户
private Map<String,Object> data = new HashMap<>();//用来保存额外数据,提升应用的扩展性能
}
创建生产者类:
将实体类转成JSON格式传输
创建消费者类:
通过KafkaListener注解监听topic
业务代码很简单,将event实体的数据保存到消息表。
然后重构之前的点赞评论关注业务,这里以点赞业务为例,其他大同小异
当点赞状态是已点赞时,将数据封装好通过生产者发送,消费者会按照上面的格式封装好存储在message表中,
后续在系统消息展示界面从message表中获取相应数据就大功告成了。