当前位置: 首页 > news >正文

常用中间件redis,kafka及其测试方法

常用消息中间件及其测试方法

      • 一、中间件的使用场景
        • 引入中间件的目的一般有两个:
          • 1、提升性能
          • 常用的中间件:
            • 1) 高速缓存:redis
            • 2) 全文检索:ES
            • 3) 存日志:ELK架构
            • 4) 流量削峰:kafka
          • 2、提升可用性
          • 产品架构中高可用设计:
            • 1) 分布式锁:redis
            • 2) 数据分布式存储:redis,es,kafka
      • 二、Redis
        • 1、redis 的数据同步策略以及数据一致性保证?
        • 2、哨兵模式的设计架构,如何理解读写分离,选举和脑裂
          • 1、什么是哨兵?
          • 2、哨兵的配置文件
          • 3、网络分区故障
          • 网络故障:
            • 1)master节点和哨兵节点出现网络故障:
            • 2)master节点和slave节点出现网络分区故障:
          • 4、脑裂是什么,怎么解决?
        • 3、缓存失效下的熔断和降级以及测试方法
          • 1、造成缓存失效的几种情况?
          • 2、采取的应对策略?
          • 3、 如何模拟redis缓存失效?
        • 4、缓存击穿下的处理方法和测试方法
          • 1、什么是缓存击穿?
          • 2、缓存击穿解决方案?
        • 5、缓存穿透下的测试方法
          • 1、什么是缓存穿透?
          • 2、缓存穿透的解决方案?
          • 3、如何测试?
        • 6、淘汰缓存还是更新缓存
          • 1、缓存操作方式
            • 1)读操作流程?
            • 2)写操作流程:淘汰缓存 or更新缓存?
            • 3)写操作:先淘汰缓存再更新数据库 or 先更新数据库再淘汰缓存?
        • 7、缓存雪崩的测试方法
          • 1、如何处理雪崩?
          • 2、如何模拟雪崩?
      • 三、Kafka
        • 1、kafka的两个常用场景?
        • 2、为什么要用消息队列?
        • 3、和其他消息队列相比,kafka的优势在哪里?
        • 4、队列模型了解吗?Kafka 的消息模型知道吗?
        • 5、什么是Producer、Consumer、Broker、Topic、Partition?
        • 6、Kafka 的多副本机制了解吗?带来了什么好处?
        • 7、Zookeeper 在 Kafka 中的作用知道吗?
        • 8、Kafka 如何保证消息的消费顺序?
        • 9、Kafka 如何保证消息不重复消费?
        • 10、如何测试kafka?

一、中间件的使用场景

引入中间件的目的一般有两个:
  • 1、提升性能
    • 产品架构中的性能设计:
    • 常用的中间件:
      • 1) 高速缓存:redis
        • 基于内存,所以比mysql块(存在磁盘io)
        • 为什么查询速度快?
          • 单进程+IO多路复用去提高性能
          • 基于内存
        • 做缓存,极大缓解了数据库压力
        • 非常适合读多写少的场景
      • 2) 全文检索:ES
        • 适用于大量搜索的场景
        • 用的倒排索引,应对读多写少的场景
        • mysql用的正序索引,应对写多读少的场景
      • 3) 存日志:ELK架构
        • logstash收集日志(目前已经被filebeat替代),然后存入es,再通过kibana展示
          在这里插入图片描述
      • 4) 流量削峰:kafka
        • 目前最流行的消息中间件
  • 2、提升可用性

二、Redis

1、redis 的数据同步策略以及数据一致性保证?
  • 现在软件架构非常复杂,面对数以万计的qps的情况下,如果单台机器到达性能瓶颈,需要一种横向扩展策略,希望把用户请求用负载均衡方式分布在其他机器分担压力。当把所有数据分布到不同机器时候,如何保证每一台机器的数据是完全一致的呢?
    在这里插入图片描述
  • 为了提升性能,必须使用集群部署,比如我们现在要一主两从架构进行部署,我们可以把写请求发送到主节点,把读请求发送到从节点,以降低主节点的压力(读写分离的意义)。如果保证主从节点的数据是一致的呢,我们就需要数据同步策略(异步同步)
    在这里插入图片描述
    在这里插入图片描述
2、哨兵模式的设计架构,如何理解读写分离,选举和脑裂
1、什么是哨兵?
  • 哨兵是redis官方推荐的集群高可用解决方案
  • 它能够自动识别redis集群的健康状态并在master节点异常时将从节点提升为master节点
2、哨兵的配置文件

在这里插入图片描述

3、网络分区故障
4、脑裂是什么,怎么解决?
  • 脑裂就是出现网络分区故障后,同时存在多个master节点。
  • 解决方案:
    • 1、master节点连接不上哨兵节点:只有多个哨兵标记它为主观下线状态,它才会真正的下线
    • 2、master节点连接不上slave节点:就会禁止写操作
3、缓存失效下的熔断和降级以及测试方法
  • 1、造成缓存失效的几种情况?
    • 缓存过期
    • 缓存更新:更新缓存一般采用淘汰更新,这个时候缓存取不到,就会去数据库里面取,再更新缓存。这就造成有极短的一段时间内,缓存是失效的
    • redis异常
    • 网络异常
  • 2、采取的应对策略?
    • 禁用某些接口,只开放核心接口:非核心接口用户一请求,就直接返回异常。保证缓存失效时候核心接口可以继续工作
    • 禁用某些服务
      在这里插入图片描述
  • 3、 如何模拟redis缓存失效?
    • 1)你需要输入出系统的核心服务列表和服务中的核心接口列表。
    • 2)注入故障,然后验证(非核心接口去访问时候应该是拒绝的)
      • 直接把redis下线
      • 注入一个网络故障
        • 比如可以用iptables模拟断网故障,tc模拟延迟故障,也可以去下载阿里开源工具chaos-blade,下载后一条命令就可以模拟故障
4、缓存击穿下的处理方法和测试方法
5、缓存穿透下的测试方法
6、淘汰缓存还是更新缓存
  • 1、缓存操作方式
    redis是高速缓存组件,需要跟数据库进行频繁交流才能让缓存生效。缓存操作方式就需要一定的步骤和规则,如果出错,就会导致出现bug
    • 1)读操作流程?
      • 先查询redis,如果redis有数据,就直接返回redis数据
      • 如果redis没有数据,就从数据库中读取数据
        • 读取数据库是有延迟的,是比较慢的操作,所以在高并发下,可能不仅有一次的读请求会从数据库中读取数据。因为假如说我们第一个请求过来之后,它还没有完成把数据库的数据更新到redis缓存的时候,其他并发也过来了,就会导致在一个比较瞬时的状态的时候,会有相当多的读数据库的请求出现
      • 从数据库读取数据后,更新redis缓存
    • 2)写操作流程:淘汰缓存 or更新缓存?
      • 淘汰缓存
        • 优点是操作简单
        • 缺点是淘汰后下一次请求就会读取数据库
      • 更新缓存
        • 数据库更新完了之后,就会更新缓存的内容。
        • 优点是不会出现下一次cache miss
        • 缺点是代价比较大(比如更新操作涉及到好几张表,会导致性能差,延缓更新缓存时间。如果在更新的时候其他的读请求进来了,会造成数据不一致的情况,可能会读到旧的数据)
      • 结论:淘汰缓存作为通用方案
    • 3)写操作:先淘汰缓存再更新数据库 or 先更新数据库再淘汰缓存?
      • 先更新数据库:如果更新数据库后还没来得及淘汰缓存服务就挂掉了,那么就会出现脏数据
      • 先淘汰缓存:如果淘汰缓存后更新数据库之前的这段时间有其他的读请求发送过来,就会把老数据读取到redis缓存中
        • 但是他在复杂场景下还是可能遇到数据不一致问题,比如写操作出现问题,比如所在磁盘io特别高,导致写缓存和更新数据库操作比较慢,可能会出现如下问题,当把淘汰缓存执行完还没有更新数据库的时候,另一个请求过来读取缓存,取的仍然是旧的值
          在这里插入图片描述
      • 结论:先淘汰缓存,可以使用延迟双删策略弥补缺陷
        • 延迟双删是什么?
          • 1)先删除缓存
          • 2)再写数据库
          • 3)休眠500毫秒(根据具体业务时间来定)
          • 4)再次删除缓存
            在这里插入图片描述
    7、缓存雪崩的测试方法
    当redis中大量缓存在一个较短的时间内全部过期,导致于在一个瞬间时间内大量的请求直接访问数据库,造成数据库崩溃
    • 1、如何处理雪崩?
      • 一般会采用熔断或降级策略。
        • 禁用某些接口,只开放核心接口:非核心接口用户一请求,就直接返回异常。保证缓存失效时候核心接口可以继续工作
        • 禁用某些服务
    • 2、如何模拟雪崩?
      • 弄挂redis服务,比如在redis和服务之间注入网络分区故障,让服务连接不上redis,看看服务是否熔断或降级
      • 写一个接口,把redis常用的缓存删了

    三、Kafka

    1、kafka的两个常用场景?
    • 1) 流量削峰
      • 先将短时间高并发产生的事务消息存储在消息队列中,然后后端服务再慢慢根据自己的能力去消费这些消息,这样就避免直接把后端服务打垮掉
    • 2) 流计算
      • 大数据处理的一种
        在这里插入图片描述
    2、为什么要用消息队列?
    • 1、通过异步处理提高系统性能(减少响应所需时间)
    • 2、降低系统耦合性:生产者(客户端)发送消息到消息队列中去,接收者(服务端)处理消息,需要消费的系统直接去消息队列取消息进行消费即可而不需要和其他系统有耦合,也提高了系统的扩展性。
    • 3、流量削锋:先将短时间高并发产生的事务消息存储在消息队列中,然后后端服务再慢慢根据自己的能力去消费这些消息,这样就避免直接把后端服务打垮掉。
    3、和其他消息队列相比,kafka的优势在哪里?
    • 1、极致的性能:最快可以每秒处理千万级别的数据
    • 2、和其他生态系统的兼容性好:Kafka 与周边生态系统的兼容性是最好的没有之一,特别是在大数据和流计算领域
    • Kafka 主要有两大应用场景:
      • 消息队列 :建立实时流数据管道,以可靠地在系统或应用程序之间获取数据。
      • 数据处理: 构建实时的流数据处理程序来转换或处理数据流。
    4、队列模型了解吗?Kafka 的消息模型知道吗?
    早期的队列模型就是生产者把消息发到消息队列,然后消费者从消息队列去取消息,但是这样做有个弊端,就是如果这个消息需要发送给多个消费者,每个消费者都要收到完整的内容,这种情况队列模型就不好解决了。kafka用的是发布订阅的消息模型,用topic作为消息载体,相当于是广播模型。只要生产者把消息发到topic里,该条消息通过主题传递的方式通知所有的消费者
    5、什么是Producer、Consumer、Broker、Topic、Partition?
    • producer:生产者,生产消息的人
    • consumer:消费者,消费消息的人
    • broker:代理,相当于kafka的实例,多个broker可以构成一个cluster[ˈklʌstə®](集群),broker里面包含topic和partition
    • topic:主题,消费者可以通过订阅topic来消费消息
    • partition:分区,一个topic里面可以有多个分区
      在这里插入图片描述
    6、Kafka 的多副本机制了解吗?带来了什么好处?
    每个分区里都有多个副本,副本里面又有一个leader副本和多个follower副本,follower副本是从leader副本里面拉取消息进行同步,相当于leader副本的拷贝。当leader副本出现问题的时候,会从follower副本里面选取新的leader。生产者和消费者只和leader副本做交互。
    好处:
    • 1、一个topic里有多个partition,然后一个partition可以在多个broker里,这样可以提升并发能力(负载均衡)
    • 2、因为partition可以指定副本数量,这样可以提升消息存储的安全性,但是同时也相应的增加了存储空间
7、Zookeeper 在 Kafka 中的作用知道吗?
  • 1、broker注册:每个broker启动时候,会到zookeeper进行注册
  • 2、topic注册:同一个topic会分成多个分区,并将其分布到多个broker,这些分区和broker对应关系由zookeeper记录
  • 3、负载均衡:对于同一个topic里有多个partition,当生产者产生消息后,kafka会尽力的将一个partition投递到多个broker里,当消费者消费的时候,zookeeper会根据当前消费者数量和broker数量来实现动态负载均衡
8、Kafka 如何保证消息的消费顺序?

因为kafka里消息是存放在partition里,而且每次添加消息到partition里都是采用尾追法,kafka只能保证partition里的消息有序。消息被添加到partition的时候都会分配一个特定的偏移量来保证顺序。
这个时候我们就有2种方式来保证消费顺序

  • 1、一个topic里只对应一个partition(不推荐)
  • 2、发送消息的时候指定key/partition(推荐):发送消息的时候我们可以发送topic,partition,key,data四个参数。如果指定partition的话,kafka可以把消息发送到指定的partition。并且,同一个key的消息可以保证只发送到一个partition
9、Kafka 如何保证消息不重复消费?

根本原因:消息已经消费了,但是没有提交offset
处理方案:
消费方做幂等校验,比如redis分布式锁,mysql的主键等
enable.auto.commit设置成false,改成手动提交offset

10、如何测试kafka?
  • 因为功能上出问题的概率不大,我们测试需要做的就是模拟producer到broker,broker到consumer之间的各种故障,再验证数据是否完整,有没有数据丢失或者重复
    • 比如网络抖动一下后,producer推送到broker的数据丢失怎么办?一般来说会做retry操作,比如重试3次,如果3次都失败了,那么可能broker本身有问题,或者网络问题,抛异常是可以的。但是retry有副作用,假设当producer推送数据给broker,broker已经保存到本地之后,把响应返回给producer的时候失败了,这时候再retry就会导致broker重复保存数据到本地存储,造成数据重复
      在这里插入图片描述
    • 如何解决这个问题呢?
      • kafka有专门的包把producer变成幂等的producer(判断是否消息之前推送过,如果是的话就不会进行第二次存储。)这个是如何实现的呢,就是根据消息生成id,producer会把消息+id一起推送到broker,broker根据消息的id和本地存储数据进行对比就可以知道消息是否重复。但是这个也有缺陷,就是只对单broker有用,多broker/partition是不行的
      • kafka有分布式事务的producer,保证broker不会重复保存数据。producer开了分布式事务以后,consumer也要做改动,要把消息读取变成committed read(只会去读取已经提交的事务)只是提供了框架,里面的逻辑是自己写的,包括consumer怎么维护offset状态,producer里事务怎么提交

相关文章:

常用中间件redis,kafka及其测试方法

常用消息中间件及其测试方法 一、中间件的使用场景引入中间件的目的一般有两个:1、提升性能常用的中间件:1) 高速缓存:redis2) 全文检索:ES3) 存日志:ELK架构4) 流量削峰:kafka 2、提升可用性产品架构中高可…...

ROS1通过rosbridge在局域网中控制turtle进行运动(PC和手机)

通过ROSbridge控制小海龟(turtlesim)的具体案例。使用一个简单的Python脚本通过通过局域网上连接上传ROSbridge服务器,并发送速度指令来控制小海龟的移动 功能包的结构如下: HTML文件的编写(界面) html用…...

MQ高级篇---消息可靠性

MQ的一些常见问题 后面内容基于springboot 2.3.9.RELEASE 消息可靠性 生产者确认机制 在publisher微服务中application.yml中添加 spring:rabbitmq:publisher-confirm-type: correlatedpublisher-returns: truetemplate:mandatory: true每个RabbitTemplate只能配置一个Return…...

SpringMVC | SpringMVC中的 “文件上传和下载”

目录: 一、文件上传1.1 文件上传“概述”1.2 文件上传“具体配置” :“前端”中配置“文件上传” ( type“file” 满足3个条件 )“后端”中配置“文件上传” ( 配置id为“CommonsMultipartResolver”的bean 配置“文件上传”的“约束条件” 通过“MultipartFile接口”参数接…...

JVM快速入门(2)HotSpot和堆、新生区、永久区、堆内存调优、JProfiler工具分析OOM原因、GC(垃圾回收)、JVM经典面试笔试题整理

5.6 HotSpot和堆 5.6.1 Hotspot 三种JVM: Sun公司,HotspotBEA,JRockitIBM,J9 VM,号称是世界上最快的Java虚拟机 我们一般学习的是:HotSpot 5.6.2 堆 Heap,一个JVM只有一个堆内存&#xff0c…...

我的风采——android studio

目录 实现“我的风采”页面要求理论代码生成apk文件 实现“我的风采”页面 要求 要求利用’java框架的边框布局实现“找的风采 ”页而,其中中间为你的生活照,左右和下面为按钮,上面为标签 理论 Java GUI编程是Java程序设计的重要组成部分…...

BMS设计中的短路保护和MOSFET选型(上)

电池管理系统(BMS)是一种能够对电池进行监控和管理的电子装备,是电池与用户之间的纽带。通过对电压、电流、温度以及SOC等数据采集,计算进而控制电池的充放电过程,主要就是为了能够提高电池的利用率,防止电…...

用go实现一个任务调度类 (泛型)

用go实现一个任务调度类 (泛型) 源码地址: https://github.com/robinfoxnan/BirdTalkServer/blob/main/server/core/workmanager.go 1.概述 实现了一个简单的任务管理系统,允许用户定义任务和工作者,并将任务分配给…...

ansible 管理工具以及常用模块

一、前期准备 1、安装 yum install ansible 如果yum源没有ansible,需要提前配置yum源: mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup wget -O…...

javaSSM公司招聘管理系统IDEA开发mysql数据库web结构计算机java编程maven项目

一、源码特点 IDEA开发SSM公司招聘管理系统是一套完善的完整企业内部系统,结合SSM框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发)MAVEN方式加 载,系统具有完整的源代码和…...

蓝桥杯day11刷题日记

P8615 [蓝桥杯 2014 国 C] 拼接平方数 思路:先把数据范围内的平方数打上标记,然后就是遍历这个区间,转成字符串(好拆数据),用substr拆开数据,再强转成整数类型,最后查看拆开的数据是…...

IDEA, Pycharm, Goland控制台乱码

IDEA, Pycharm, Goland控制台乱码 问题描述: 控制台出现����等乱码 复现频率: 总是 解决方案: 以IDEA为例 添加 -Dfile.encodingUTF-8位置 idea64.exe.vmoptions 在安装idea的bin目录idea.vmoptions idea客户端 示意图...

JavaScript单元测试jasmine学习(一)

介绍: jasmine是用于测试JavaScript的一种测试框架,BDD(Behavior Driven Development)行为驱动开发。不依赖于任何其他JavaScript框架,也不需要DOM 准备工作: 1. 首先添加jasmine到自己的项目中 npm install --save-dev jasmine 2. 在项目…...

108、3D Gaussian Splatting for Real-Time Radiance Field Rendering

简介 官网 更少训练时间的同时实现最先进的视觉质量,能在1080p分辨率下实现高质量的实时(≥30 fps)新视图合成 NeRF使用隐式场景表示,体素,点云等属于显示建模方法,3DGS就是显示辐射场。它用3D高斯作为灵活高效的表示方法&…...

PHP之CURL和Socket

文章目录 一、CURL1.基本流程(1)初始化(2)向服务器发送请求(3)向服务器发送请求(4)关闭curl 2.CURLOPT参数记得写一个文件curl上传的例子记得写一个json上传的例子3.CURL批处理 二、…...

【Web】NKCTF 2024 个人wp(部分)

目录 my first cms 全世界最简单的CTF attack_tacooooo 属实太菜了,3/4 my first cms 一眼搜版本2.2.19 CVE -CVE-2024-27622 GitHub - capture0x/CMSMadeSimple 访问/admin/login.php 爆出弱口令,后台登录 admin Admin123 Extensions > User D…...

QT常见布局器使用

布局简介 为什么要布局?通过布局拖动不影响鼠标拖动窗口的效果等优点.QT设计器布局比较固定,不方便后期修改和维护;在Qt里面布局分为四个大类 : 盒子布局:QBoxLayout 网格布局:QGridLayout 表单布局&am…...

政安晨:【深度学习部署】—— TensorFlow Extended(TFX)介绍

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎机器学习 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 前言 TensorFlow Extended(TFX&a…...

宝石与石头

宝石与石头 链接:https://leetcode.cn/problems/jewels-and-stones/description/ 给你⼀个字符串 jewels 代表石头中宝石的类型,另有⼀个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了⼀种你拥有的石头的类型,你想知道你拥有的石头中有多…...

【Vue3之computed属性(四)】

文章目录 前言一、computed属性有缓存二、使用方法三、修改全名 前言 理解computed属性,实现输入姓和名得出全名并双向绑定,区分单向绑定和双向绑定。测试computed属性和方法的区别 一、computed属性有缓存 先引入computed,写箭头函数定义并…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes&#xff0…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...