项目笔记5-KafKa

目前最好的异步消息队列处理器

阻塞队列

image.png

写一个生产者消费者模式,使用阻塞队列

Kafka入门

image.png

消息持久化:消息永久保存,存到硬盘里。硬盘顺序读写性能很高,可能高于内存的随机读写。所以才能保证海量数据高速度处理
高可靠性:靠分布式,可以做集群部署
高扩展性:简单配配就可以加一台服务器

术语

Broker:就是一台服务器的意思
Zookeeper:是一个独立的软件和应用,用来管理集群,可以用Zookeeper管理集群。可以单独下载也可以内置。

消息队列实现方式
点对点:生产者消费者,每个数据只被一个消费者消费
发布订阅模式(Kafka模式):数据可以被多个消费者使用

Topic:生产者发布的位置就是Topic,可以理解为文件夹。
Partition:对Topic位置进行分区如最开始的图片,可以同时向多个分区写入,追加的写入。例如生产者追加数据。读的话则按照顺序读连续的Offset作为一个消息
OffSet:就是存放的索引
RePlica:副本对数据做备份的,为了让数据更可靠,每一个分区都存不是一个,而是多个副本
Leader Replica:主副本从这个分区获取数据的时候是主副本给你数据
Follower Replica:只负责备份数据,如果主副本挂了,则会从副本中选择一个作为主副本

  1. 官网下载推荐版本,解压
  2. 配置zookeeper.properties,用于存放数据的目录
dataDir=/home/...
image.png

配置server.properties

log.dirs=/home/...
image.png
  1. 命令
    去官网快速开始部分学习
    启动zookeeper,使用配置文件
./zookeeper-server-start.sh config/zookeeper.properties

再开启一个窗口启动kafka。同上操作
再启动一个命令,使用kafka命令工具

//创建一个Topic主题,代表位置,也代表消息的分类
./kafka-topics.sh --create --bootstrap-server localhost:9092 
--replication-factor 1 --partitions 1 
--topic test

没有提示则创建好了
查看所有的主题,指定某个服务器

./kafka-topics.sh --list --bootstrap-server localhost:9092

向主题发送消息,调用生产者执行文件

//指定向哪个服务器发送消息以及主题
kafka-console-producer --broker-list localhost:9092 --topic test
//发送消息
>hello
>word

再开启一个窗口执行消费者

//指定服务器,它topic 并从头读数据
./kafka-console-consumer.sh --bootstrap-server localhost:9092 -- topic test --from-beginning
//输出hello word

Spring整合Kafka

  • 引入依赖
    spring-kafka
  • 配置Kafka
    配置server、consumer
  • 访问Kafka
    • 生产者
      kafkaTemplate.send(topic, data);
  • 消费者
    @KafkaListener(topics = {"test"})
    public void handleMessage(ConsumerRecord record) {}

配置项

  1. consumer配置项


    image.png

    2.application.properties

# 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//间隔3s
  1. 测试类
    测试类中定义


    image.png

    image.png

发送系统通知

image.png

image.png

三类定义三个不同的主题,

  1. 封装事件对象,更好的扩展。
    把set方法返回this,实现链式编程。


    image.png
image.png
  1. 事件生产者类,EventProducer


    image.png
  2. 事件的消费者
    事件的消费者主要是接收到事件对象后把它封装到Message类中,并存入数据库。参照数据库from_id为1 的数据格式。
  3. 评论点赞,关注,
    取消赞没必要通知。
    评论连接到评论详情,关注连接到用户主页,帖子也是连接到帖子详情。
    like方法加一个postId参数,便于连接到帖子详情。
  4. 注意要把kafka zookeeper启动。windows下可以kafka会报错,我们把kafka-log目录删掉重启即可。

显示系统通知

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


    image.png

    2, MessageController
    把三种类型的数据都查出来,其中content是json传的数据,我么需要把它转成对象,但是传进去的有转义字符,我们需要把转义字符解析出来

String content = HtmlUtil.htmlUnescape(message.getContent());
Map data = JSONObject.parseObject(content, HashMap.class);

这样就得到了我们要的数据
查询评论类通知需要的数据是


image.png

另外两类差不多,直接复制然后修改一些名字即可。
关注去掉postId参数,因为不用连接到详情。

然后查询私信的未读消息数量以及未读通知的数量。计算出总的消息数。私信列表也要查询出通知的数量。

  1. 处理页面,
    letter的头复制到notice即可唯一修改的就是active激活位置,active表示激活的页面标签,修改下即可。
  2. 通知详情
    设置分页,消息已读,消息的发送人


    image.png

页面,处理返回按钮,三个都是显示到同一个评论处理,我们复制三份,然后通过判断显示。

image.png
  1. 消息未读的数量,用拦截器处理
    MessageInterceptor


    image.png

你可能感兴趣的:(项目笔记5-KafKa)