MQ常见问题总结
消息可靠性问题消息丢失的可能性
发送时丢失:
生产者发送的消息未送达exchange
消息到达exchange后未到达queue
MQ宕机,queue将消息丢失
consumer接受到消息后未消费就宕机
根据以上几种可能,我们分别有生产者消息确认,消息持久化,消费者消息确认和消费失败重试机制来解决以上的问题
生产者消息确认RabbitMQ提供了发送者确认和发送者回执两种机制来确认消息不会在发送过程中丢失
Publisher Confirm(发送者确认)Publisher Confirm机制是RabbitMQ用来确保消息被成功发送到RabbitMQ服务器(至少是成功到达交换机)的一种机制。当启用这个机制时,RabbitMQ会向生产者(publisher)发送一个确认(ack)或否定确认(nack)来告知消息是否被成功处理。
ack(确认):当消息成功到达交换机时,RabbitMQ会向生产者发送一个ack,表示消息已经被正确处理。
nack(否定确认):如果RabbitMQ因为内部错误(如资源不足)而无法处理消息,它会发送一个nack给生产者。但需要注意的是,在标准的Rabbit ...
微服务中的redis
Redis面临的的问题在单点的redis中,redis经常面临着数据丢失,并发能力弱,故障恢复能力弱,以及存储能力弱,这都使其在微服务的架构中难以立足,接下来,我将以这四方面的问题出发,介绍每一种问题的解决办法
Redis持久化由于redis时基于内存存储,这会导致一旦服务器重启,存储在服务器中redis的数据将会丢失,即使redis中存储的一般是相对与不那么重要的热点数据,但一旦丢失,仍会造成很大的影响,解决这个问题自然要做到redis数据的持久化,常见的持久化分为两种,分别是RDB和AOF
RDB持久化RDB持久化通过创建Redis在某一时间点的快照(snapshot)来实现数据的持久化。这个快照文件是一个经过压缩的二进制文件,包含了Redis在某个时间点上的数据库状态。简单来说就是把内存中所有数据记录到磁盘中,当redis重启后,从磁盘中读取快照文件,恢复数据
RDB持久化的工作原理
触发条件:RDB持久化可以通过两种方式来触发:
手动触发:通过执行SAVE或BGSAVE命令。SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,因此不推荐在生产环境中使用。而BGS ...
redis缓存问题
缓存击穿缓存击穿问题详细介绍缓存击穿是指在高并发场景下,一个或多个请求查询一个不存在的缓存数据(通常是热点数据)可能是由于该缓存数据已过期,由于缓存中没有该数据,导致这些请求直接穿透到数据库,造成数据库的压力过大,进而导致系统性能下降的问题。
缓存击穿的主要原因包括:
缓存失效:缓存中的数据由于过期或被主动删除,导致大量请求无法从缓存中获取数据,从而直接访问数据库。
并发请求:在高并发场景下,多个进程或线程同时查询一个不存在的缓存数据,导致多个请求同时访问数据库。
缓存击穿可能带来的问题包括:
数据库压力增大:大量请求直接访问数据库,导致数据库负载增大,性能下降,甚至可能发生宕机。
响应时间增加:由于直接访问数据库需要花费更多的时间,因此缓存击穿会导致响应时间增加,降低用户体验。
解决方案热点数据永不过期
方法描述:对于频繁访问且重要的热点数据,可以设置其永不过期。同时,通过异步线程定期刷新缓存中的数据,以保持数据的实时性。
优势:可以避免因缓存过期而导致的缓存击穿问题,提高系统的稳定性和性能。
注意事项:需要确保定期刷新缓存的线程能够稳定运行,并且及时更新缓存中的数据以保持数 ...
Caffeine缓存库
简介Caffeine是一个基于Java8开发的提供了近乎最佳命中率的高性能缓存库,它源自Google Guava的Cache设计,但提供了更多的优化和特性。以下是对Caffeine的详细解析:
Caffeine的特点
高性能:Caffeine通过优化的算法和设计,实现了接近最优的缓存性能。它支持高效的并发访问,能够在大规模数据和高并发访问的场景下保持良好的性能。
灵活性:Caffeine提供了多种配置选项,允许开发者根据具体需求定制缓存行为。这包括缓存大小限制、过期时间、自动加载策略等。
智能淘汰策略:Caffeine采用了基于TinyLFU(Least Frequently Used)的新型淘汰算法,该算法在保持高命中率的同时有效控制缓存大小。这意味着Caffeine能够自动移除“不常用”的数据,以保持内存的合理占用。
易于集成:Caffeine提供了简单易用的API,并且与Guava的Cache有良好的兼容性,支持JSR-107(JCache)规范,可以与其他Java框架无缝融合。
统计和监控:Caffeine还提供了缓存的统计信息,帮助开发者进行性能监控和调优。
Caffein ...
MongoDB数据库
MongoDB是一个基于分布式文件存储的开源数据库系统,由C++语言编写。它旨在为WEB应用提供可扩展的高性能数据存储解决方案。以下是对MongoDB的详细介绍
简介基本概述
类型:MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
数据存储:MongoDB使用BSON(Binary JSON)格式存储数据,这种格式支持存储复杂的数据类型,类似于JSON对象,但具有更高的存储效率和性能。
数据模型:MongoDB采用文档导向的数据模型,文档是一个键值对的集合,类似于关系型数据库中的行,但更为灵活。文档可以包含嵌入式文档、数组和其他复杂类型。
主要特点
高性能:MongoDB使用内存映射文件和预分配空间等技术优化数据读写性能,支持快速的插入、更新和查询操作。
可扩展性:MongoDB支持水平扩展和自动分片,可以方便地增加服务器和处理大规模数据。
模式自由:MongoDB不需要事先定义表格结构,可以存储各种类型的数据,支持嵌入式文档和引用两种数据关联方式。
强大的查询语言:MongoDB提供丰富的查询操作符和聚合管道功能,支持复杂 ...
neo4j图数据库
介绍Neo4j是一个高性能的、基于Java的NoSQL图形数据库,它将结构化数据存储在网络(从数学角度称为图)上而不是传统的表中。Neo4j因其嵌入式、高性能、轻量级等优势,在数据存储、检索、分析和挖掘等方面有着广泛的应用。以下是对Neo4j的详细介绍
一、Neo4j的基本特性
高性能的图引擎:Neo4j可以被看作是一个高性能的图引擎,具有成熟和健壮的数据库的所有特性。它支持大规模可扩展性,可以处理数十亿节点/关系/属性的图,并且可以扩展到多台机器并行运行。
面向对象的网络结构:程序员在Neo4j中工作在一个面向对象的、灵活的网络结构下,而不是严格、静态的表中。这种结构使得Neo4j非常适合表示复杂、互连接、低结构化的数据。
完全的事务特性:Neo4j是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎。它支持完整的ACID(原子性、一致性、隔离性和持久性)规则,确保数据的一致性和完整性。
CQL查询语言:Neo4j使用CQL(Cypher Query Language)作为查询语言,这是一种声明性模式匹配语言,其语法简单且人性化、可读性强。CQL遵循 ...
Elasticsearch搜索引擎
索引类型正向索引定义与结构
正向索引是从文档到单词的映射索引结构,它将文档中的每个单词与包含该单词的文档进行关联。这种索引结构适合于根据文档查找单词。
正向索引通常是以文档的ID为关键字,表中记录文档中每个单词的位置信息。
优点
结构简单:建立和维护相对简单。
易于维护:当有新文档加入或旧文档删除时,索引的更新相对容易。
局限性由于其在对包含关键字的查询中需要逐行排查,所以此种查询效率极低,只适合与数据库系统等较为简单的查询作用,并不适合庞大的搜索引擎
倒排索引定义与结构
倒排索引是一种索引方法,用于存储在全文搜索下某个单词在一个文档或一组文档中的存储位置的映射。它主要由“单词词典”和“倒排文件”两部分组成。单词词典记录了文档集合中出现过的所有单词,而倒排文件则包含了每个单词对应的倒排列表,即包含该单词的所有文档的列表及其相关信息(如文档编号、词频、位置等)。
倒排索引的设计是从单词到文档的映射,即它能够快速根据单词找到包含该单词的所有文档。
查询过程将搜索语句分为一个一个词,去词条列表中查询文档id,根据id去查询文档存入结果集
优点
查询效率高:能够快速根据单词找到包含该单词 ...
高并发问题优化
几种常见事务失效原因方法自调用导致的事务失效
场景:在Spring中,声明式事务通常是通过AOP(面向切面编程)实现的,这意味着事务管理是通过代理对象对目标方法的调用进行增强的。然而,当同一个类中的方法A调用方法B,且方法B上使用了@Transactional注解时,如果这种调用是直接进行的(即非通过代理对象),那么事务的增强处理就不会被触发,从而导致事务失效。
原因:AOP代理通常是通过Spring的容器在运行时动态生成的,它仅对外部调用进行拦截和处理。对于类内部的直接方法调用,由于绕过了代理对象,因此无法应用事务的增强。
解决方案:既然调用的不是代理对象,那我们就想办法获取代理对象,通过AopContext.currentProxy()获取当前类的代理对象,并通过该代理对象调用方法B。但请注意,这种方式需要确保在Spring配置中启用了@EnableAspectJAutoProxy(exposeProxy = true)
异常处理不当导致的事务失效
场景:如果@Transactional注解的方法内部捕获了异常,并且没有将异常重新抛出,或者没有将捕获的异常类型指定为需要回滚的异常 ...
Docker学习
简介Docker是一个开源的应用容器引擎,它允许开发者将他们的应用及其依赖包打包到一个可移植的容器中,并发布到任何流行的Linux或Windows操作系统的机器上。Docker容器是完全使用沙箱机制,相互之间不会有任何接口,从而提供了高度的隔离性和安全性。
Docker由多个组件组成,包括Docker客户端(DockerClient)、Docker守护进程(Docker Daemon)、Docker镜像(Docker Image)和Docker容器(Docker Container)等。这些组件协同工作,使得开发者能够轻松地构建、运行和管理应用程序容器。
作用以下几个方面:
应用程序打包:Docker可以将应用程序及其所有依赖项打包成一个称为容器的单元。这意味着,无论在哪里运行Docker,应用程序都能以相同的方式运行,从而消除了“在我的机器上工作”的问题。
简化部署:使用Docker,开发人员可以创建包含所有依赖项和配置的应用程序镜像,并将其推送到Docker仓库。然后,运维人员可以从该仓库中拉取镜像,并在生产环境中运行它,无需担心环境差异。
简化配置:Docker使用Docker ...
linux学习
目录结构
linux操作系统的目录结构
Linux只有一个顶级目录,称之为:根目录
Windows系统有多个顶级目录,即各个盘符
/在Linux系统中表示
出现在开头的/表示根目录,出现在后面的/表示层级关系
Linux命令入门Linux命令基础什么是命令,命令行
命令:即Linux操作指令,是系统内置的程序,可以以字符化的形式去使用
命令行:即Linux终端,可以提供字符化的操作页面供命令执行
Linux命令通用格式command[-options][parameter]
命令本体,即命令本身
可选选项,控制命令的行为细节
可选参数,控制命令的指向目标
ls命令入门
ls命令作用:在命令行中,以平埔的形式,展示当前工作目录(默认Home目录)下的内容
Home目录:每一个用户在Linux系统的专属目录:默认在/home/用户名
当前工作目录:Linux命令行在执行命令的时候,需要一个工作目录,打开命令行程序(终端)默认设置目录在Home目录
ls命令的参数和选项
ls命令参数的作用:可以查看指定文件夹的内容,如果不给定参数,则查看当前工作目 ...