苍老师下载kafa
cmd
z然后按住tab
先运行zookeeper
然后打这个命令:
zookeeper-server-start.bat …\config\zookeeper.properties
再运行
kafak
kafka-server-start.bat …\config\server.properties
消息队列
下载Kafka
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eb0sbElM-1653008906494)(image-20220519145456971.png)]
Dubbo远程调用的性能问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UmWEzUYC-1653008906499)(image-20220519152055211.png)]
任何dubbo调用都有这个问题
就是Dubbo中的消费者在调用服务的提供者之后,是等待服务提供者响应结果之后,才能运行后面的操作的,这个过程中,消费者程序进入阻塞状态属于资源的浪费
在非极致要求高并发性能的前提下,Dubbo的内部的资源使用缺陷是可以接受的
但是在极致要求高并发性能环境下,并且我们对生产者的结果不迫切需求时,我们就可以使用消息队列代替Dubbo调用,消除消费者线程的阻塞
什么是消息队列
消息队列(Message Queue)简称MQ
消息队列是采用"异步(两个微服务项目并不需要同时完成请求)"的方式来传递数据完成业务操作流程的业务处理方式
消息队列的优缺点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r2tdC6zv-1653008906501)(image-20220519154952335.png)]
常见面试题
- 利用异步的特性,提高服务器的运行效率,减少线程阻塞的时间
- 削峰填谷:在并发峰值的瞬间将信息保存到消息队列中,依次处理,不会因短时间需要处理大量请求而出现意外,在并发较少时在依次处理队列中的内容,直至处理完毕
- 消息队列的弊端:因为是异步执行,order模块完成响应时,stock模块可能还没有运行,这样的话就可能出现延迟的现象,如果不能接受这种延迟,就不要使用消息队列
常见的消息队列软件
- Kafka:性能好
- RabbitMQ:功能好
- RocketMQ:阿里的
- ActiveMQ:几年前流行的
常见面试题:死信队列
如果不使用消息队列,我们可以使用Seata或类似的事务管理工具,保证数据的完整性,但是一旦有消息队列的加入,那么Seata就不能使用了
如果消息的接收方运行发生异常或错误,我们可以在发生异常错误处理的位置
进行代码的编写,手动实现数据的回滚,也就是向消息的来源发送信息,让消息的来源处理异常恢复数据之前的样子
如果在消息队列发送和接收的过程中不断发生异常,我们需要选择一个节点,最终向消息队列指定名称中发送一个信息,这个信息中只有错误发生的描述
但是没有任何程序在接收,这就是死信队列
死信队列中的信息会定期有人工处理,修改数据库中的信息
Kafka
什么是Kafka
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。该项目的目标是为处理实时数据提供一个统一、高吞吐、低延迟的平台。Kafka最初是由LinkedIn开发,并随后于2011年初开源。
kafka的软件结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wr18vnOx-1653008906503)(image-20220519162807497.png)]
Producer:消息的发送方,也就是消息的来源,Kafka中的生产者
order就是消息的发送方
Consumer:消息的接收方,也是消息的目标,Kafka中的消费者
stock就是消息的接收方法
Topic:话题或主题的意思,消息的收发双方要依据同一个话题名称,才不会将信息错发给别人
Record:消息记录,就是生产者和消费者传递的信息内容,保存在指定的Topic中
Kafka的特征与优势
Kafka作为消息队列,它和其他产品相比,突出的特征就是性能优秀
Kafka是将消息队列中的信息保存在硬盘中的,
但是Kafka对硬盘读取效率的优化,可以做到和内存效率接近,
主要依靠"顺序读写,零拷贝,日志压缩等技术"
Kafka处理队列中数据的默认设置
Kafka队列中的信息能够一直向硬盘中保存(理论上没有大小限制)
Kafka默认队列中的信息保存7天,缩短这个时间会减少硬盘空间消耗
kafka的安装和启动
最好找到一个根目录路径下解压kafka
然后路径不要有空格和中文
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lPxXYgJJ-1653008906505)(image-20220519165423916.png)]
创建一个空文件夹,用于保存数据,文件夹名称随意,但必须是空的
本次创建名称为Data
没有所谓的安装操作,我们启动它就可以了
但是启动kafka之前,必须先启动zookeeper软件,才能启动kafka
先到F:\kafka\config下配置有文件zookeeper.properties
找到dataDir属性修改如下
dataDir=F:/data
注意F盘和data文件夹名称,匹配自己电脑的真是路径和文件夹名称
还要修改server.properties配置文件
log.dirs=F:/data
修改注意事项和上面相同
下面开始先启动zookeeper
进入路径F:\kafka\bin\windows
在地址栏输入cmd进入dos,输入下面命令启动zookeeper
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mqu3pvFL-1653008906506)(image-20220519173430192.png)]
zookeeper-server-start.bat ..\..\config\zookeeper.properties
同样的方法启动kafka
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RHdfrpaj-1653008906507)(image-20220519173804422.png)]
kafka-server-start.bat ..\..\config\server.properties
两个项目启动之后不要关闭dos窗口
附录
Mac系统启动Kafka服务命令(参考):
# 进入Kafka文件夹
cd Documents/kafka_2.13-2.4.1/bin/
# 动Zookeeper服务
./zookeeper-server-start.sh -daemon ../config/zookeeper.properties
# 启动Kafka服务
./kafka-server-start.sh -daemon ../config/server.properties
Mac系统关闭Kafka服务命令(参考):
# 关闭Kafka服务
./kafka-server-stop.sh
# 启动Zookeeper服务
./zookeeper-server-stop.sh
在启动kafka时有一个常见错误
wmic不是内部或外部命令
这样的提示,需要安装wmic命令,安装方式参考
https://zhidao.baidu.com/question/295061710.html
测试kafka
在cart-webapi项目中
添加依赖
<!-- Google JSON API -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<!-- Kafka API -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
yml文件添加配置
spring:
kafka:
# 定义kafka的位置
bootstrap-servers: localhost:9092
# 为当前项目的所有话题设置前缀,也就是分组名称,是框架强制要求配置的
consumer:
group-id: csmall
SpringBoot启动类
@SpringBootApplication
@EnableDubbo
// ↓↓↓↓↓↓↓↓↓
@EnableKafka
// 激活SpringBoot自带的调度工具
@EnableScheduling
public class CsmallCartWebapiApplication {
public static void main(String[] args) {
SpringApplication.run(CsmallCartWebapiApplication.class, args);
}
}
我们要实现周期性的向kafka发送信息
也就是利用SpringBoot的调度工具每隔一段时间运行包含向kafka发送信息的代码
再编写Kafka的消费者(信息接收方)接收信息并输出
随笔
布隆过滤器计算器
https://hur.st/bloomfilter
windows安装redisbloom布隆过滤器
https://blog.csdn.net/weixin_44770915/article/details/107918770
选举的过程
一个集群服务器要选出一个领导
一般的做法是,每个服务器向其他服务器发送请求
每个服务器也对其他服务器发送过来的请求做响应
但是每个服务器只响应第一个发送到本服务的请求(每个服务器只有一张选票)
最终获得响应(选票)最多的服务器称为集群的领袖(Leader)
Lead负责统筹和通用配置和组织工作
当各个服务器信息有分歧时,各个服务器,会比对有分歧的信息,然后少数服从多数
一般集群数量是单数,不会出现平票情况
削峰填谷
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-60gneOn0-1653008906509)(image-20220519153958574.png)]
zookeeper
zoo:动物园
keeper:维持者
zookeeper可以翻译为动物管理员
大数据很多软件使用动物logo
zookeeper就是管理很多软件配置的文件系统
实现各种软件将配置信息保存在zookeeper中,
我们需要修改配置文件信息时,只需要修改Zookeeper中的信息就可以了
长此以往,很多软件就直接将配置文件保存在zookeeper中
Kafka就是