1. 阻塞队列

  • BlockingQueue
    • 解决线程通信的问题。
    • 阻塞方法:put、take。
      • 当队列为空时阻塞take
      • 当队列为满时阻塞put

image.png

  • 生产者消费者模式
    • 生产者:产生数据的线程。
    • 消费者:使用数据的线程。
  • 实现类(示例BlockingQueueTests.java)

    • ArrayBlockingQueue
    • LinkedBlockingQueue
    • PriorityBlockingQueue、SynchronousQueue、DelayQueue等。

      2. Kafka入门

  • Kafka简介

    • Kafka是一个分布式的流媒体平台。
    • 应用:消息系统、日志收集、用户行为追踪、流式处理。
  • Kafka特点
    • 高吞吐量、消息持久化(数据存在硬盘)、高可靠性(分布式,所以有容错性)、高扩展性。
  • Kafka术语
    • Broker(Kafka的服务器)、Zookeeper(独立软件,可以做集群,Kafka有内置的)
    • 消息队列实现方式:点对点,发布订阅模式(Kafka的模式)
      • Topic(主题,存放消息)、Partition(分区,提高并发能力)、Offset(消息在分区内的索引)
    • 副本:对数据做备份,每个分区有多个备份
      • Leader Replica(主副本,作响应) 、Follower Replica(从副本,只做备份)

image.png

  • http://kafka.apache.org

  • 引入依赖

    • spring-kafka
  • 配置Kafka
    • 配置server、consumer
  • 访问Kafka
    • 生产者
      • kafkaTemplate.send(topic, data);
    • 消费者
      • @KafkaListener(topics = {“test”}) public void handleMessage(ConsumerRecord record) {}
  • 进行测试KafkaTests.java

    4. 发送系统通知

  • 触发事件

    • 评论后,发布通知
    • 点赞后,发布通知
    • 关注后,发布通知

image.png

  • 处理事件

    • 封装事件对象Event
    • 开发事件的生产者EventProducer类
      • 将事件发布到指定的主题
    • 开发事件的消费者(将数据插入到数据库)EventConsumer类
      • 评论,关注,点赞后将消息存入Message表中
        • CommentController中,触发评论事件,如果评论的是帖子,还需要触发发帖事件,更新redis中的分数计算
        • FollowController中,触发关注事件
        • LikeController中,触发点赞时间,如果评论的是帖子,还需要触发发帖事件,更新redis中的分数计算
      • 发帖后,将数据库中的帖子更新到ElasticSearch服务器中
        • DiscussPostController中,触发发帖事件后,更新redis中的分数计算
      • 删帖后,将ElasticSearch服务器中的帖子删除
        • DiscussPostController中,触发删帖事件

          5. 显示系统通知

  • MessageController类

  • 通知列表getNoticeList方法
    • 显示评论、点赞、关注三种类型的通知
  • 通知详情
    • 分页显示某一类主题所包含的通知
  • 未读消息
    • 在页面头部显示所有的未读消息数量