1. 阻塞队列
- BlockingQueue
- 解决线程通信的问题。
- 阻塞方法:put、take。
- 当队列为空时阻塞take
- 当队列为满时阻塞put
- 生产者消费者模式
- 生产者:产生数据的线程。
- 消费者:使用数据的线程。
实现类(示例BlockingQueueTests.java)
Kafka简介
- Kafka是一个分布式的流媒体平台。
- 应用:消息系统、日志收集、用户行为追踪、流式处理。
- Kafka特点
- 高吞吐量、消息持久化(数据存在硬盘)、高可靠性(分布式,所以有容错性)、高扩展性。
- Kafka术语
- Broker(Kafka的服务器)、Zookeeper(独立软件,可以做集群,Kafka有内置的)
- 消息队列实现方式:点对点,发布订阅模式(Kafka的模式)
- Topic(主题,存放消息)、Partition(分区,提高并发能力)、Offset(消息在分区内的索引)
- 副本:对数据做备份,每个分区有多个备份
- Leader Replica(主副本,作响应) 、Follower Replica(从副本,只做备份)
引入依赖
- spring-kafka
- 配置Kafka
- 配置server、consumer
- 访问Kafka
- 生产者
- kafkaTemplate.send(topic, data);
- 消费者
- @KafkaListener(topics = {“test”}) public void handleMessage(ConsumerRecord record) {}
- 生产者
-
4. 发送系统通知
触发事件
- 评论后,发布通知
- 点赞后,发布通知
- 关注后,发布通知
处理事件
- 封装事件对象Event
- 开发事件的生产者EventProducer类
- 将事件发布到指定的主题
- 开发事件的消费者(将数据插入到数据库)EventConsumer类
- 评论,关注,点赞后将消息存入Message表中
- CommentController中,触发评论事件,如果评论的是帖子,还需要触发发帖事件,更新redis中的分数计算
- FollowController中,触发关注事件
- LikeController中,触发点赞时间,如果评论的是帖子,还需要触发发帖事件,更新redis中的分数计算
- 发帖后,将数据库中的帖子更新到ElasticSearch服务器中
- DiscussPostController中,触发发帖事件后,更新redis中的分数计算
- 删帖后,将ElasticSearch服务器中的帖子删除
- 评论,关注,点赞后将消息存入Message表中
MessageController类
- 通知列表getNoticeList方法
- 显示评论、点赞、关注三种类型的通知
- 通知详情
- 分页显示某一类主题所包含的通知
- 未读消息
- 在页面头部显示所有的未读消息数量