📄🦌🙌🐟🏖️
乘与零-cenyuio
让生活变的更有趣~
热门文章
按住 Shift 横向滚动
RabbitMQ 消息重复消费问题处理方案(消息幂等性)

RabbitMQ 消息重复消费问题处理方案(消息幂等性)

本文讨论了RabbitMQ中消息重复消费的问题及其解决方案,特别是如何通过幂等性来确保消息处理的可靠性。文章首先分析了消息重复消费的三个主要原因:生产者重试、消费者确认超时和网络波动。接着,解释了幂等性的概念,即同一条消息被多次消费时,业务结果应与一次性消费一致。 为实现消息的幂等性,文章提出了三种解决方案: 1. **唯一标识 + 幂等表**:为每条消息分配唯一ID,消费者在处理消息前通过查询幂等表来确认消息是否已被消费过。如果未消费,则处理消息并更新幂等表;否则,直接丢弃消息。 2. **基于Redis的SETNX**:利用Redis的SETNX命令,以消息唯一ID作为key,在消费前检查key是否存在,若不存在则处理消息,否则直接丢弃。 3. **业务逻辑天然幂等**:某些业务操作本身天然具有幂等性,如更新操作或查询操作,执行多次结果一致。 最后,文章强调了实现幂等性时需要注意的关键事项,如消息唯一ID的生成、手动ACK机制、幂等表或Redis的过期设置,以及异常处理的区分。 总结来说,保证RabbitMQ消息幂等性的核心是通过唯一标识和幂等校验,确保消息不会被重复处理,从而提高系统的可靠性和稳定性。

SSL 证书自动续期工作流(Certimate)

SSL 证书自动续期工作流(Certimate)

**摘要:** Certimate 是一个完全开源免费的自托管 SSL 证书 ACME 工具,支持自动化的证书申请、部署、续期和监控,适用于各大主流云厂商。它具备自托管、零依赖、低资源占用和易操作等特点,用户可以通过图形化界面轻松配置和管理证书。 部署过程简单,支持 Docker Compose,使用前需修改默认管理员密码。创建工作流时,用户需获取域名提供商的授权凭据(如阿里云 DNS),并通过图形界面配置证书申请和部署节点,最后设置定时触发以自动续期。Certimate 适用于需要自动化 SSL 证书管理的场景,尤其适合资源有限的环境。

RabbitMQ 工作模式

RabbitMQ 工作模式

消息队列(MQ)是一种在分布式系统中用于传递消息的中间件,常见的有ActiveMQ、RabbitMQ、Kafka等。MQ的主要作用包括解决应用耦合、异步处理和流量削峰等问题,从而实现高性能、高可用、可伸缩和最终一致性架构。 1. **应用解耦**:通过引入MQ,订单系统可以与其他系统解耦,订单系统只需发送消息给MQ,由MQ通知其他系统执行操作,减少系统间的依赖,提高系统的独立性和容错性。 2. **异步处理**:MQ适用于无需即时返回且耗时的操作,如订单系统处理业务逻辑时,引入MQ可以将响应时间从600ms缩短至5ms,显著提升系统性能。 3. **流量削峰**:在大流量访问时,MQ可以帮助限制流量,确保服务器正常运行,避免因流量过大而导致系统崩溃。 总之,MQ通过解耦、异步处理和流量削峰,提升了系统的性能、可维护性和稳定性。

构建 SSM(Spring + SpringMVC + Mybatis)的 Maven 项目

构建 SSM(Spring + SpringMVC + Mybatis)的 Maven 项目

文章详细介绍了一个基于Spring、MyBatis和Maven的Java Web项目的构建过程,分为两种配置方式。 **方式一:传统XML配置** 1. 创建Maven项目,项目结构包括多个包和文件。 2. 创建数据库`mybatis`,并创建`user`表。 3. 在`pom.xml`中引入相关依赖,如Spring、MyBatis、Junit、Druid等。 4. 配置项目文件,包括`application.xml`、`db.properties`、`SqlMapConfig.xml`和`web.xml`。 5. 创建实体类`User`,定义属性及`toString`方法。 6. 创建控制器`UserController`,定义查询用户信息的方法。 7. 实现业务层`UserService`接口及其实现类`UserServiceImpl`。 8. 实现DAO层`UserDao`接口及对应的`UserDao.xml`,定义SQL查询。 **方式二:无XML配置** 1. 项目结构与方式一类似,但无需配置`web.xml`、`application.xml`和`SqlMapConfig.xml`。 2. 使用`App.java`和`WebStart.java`替代XML配置,定义数据源、SQL会话工厂等。 3. `WebStart.java`实现`WebApplicationInitializer`接口,替代`web.xml`的功能。 **测试与运行** 1. 通过`http://127.0.0.1/user/get`获取全部用户信息。 2. 通过`http://127.0.0.1/user/getId?id=41`根据ID查询用户信息。 文章展示了如何通过传统XML配置和无XML配置两种方式构建一个基于Spring和MyBatis的Java Web项目,并通过测试验证了项目的功能。

idea 异常处理,java文件无法解析、java文件创建报错

idea 异常处理,java文件无法解析、java文件创建报错

文章描述了在处理Java文件时遇到的两个异常现象:一是Java文件在编辑器中没有高亮效果,二是无法成功创建Java文件。通过排查,发现问题出在与“yarn.lock”文件类型的冲突。解决方法包括删除与Java文件相关的配置,重新切换到Java文件类型并添加“*.java”配置,最后保存退出。经过这些步骤后,Java文件能够正常解析并成功创建,编辑器中的高亮效果也恢复正常。

修改idea 创建maven-archetype-webapp 项目时,web.xml默认头文件版本号

修改idea 创建maven-archetype-webapp 项目时,web.xml默认头文件版本号

本文详细介绍了一个技术解决方案:如何在IntelliJ IDEA中创建Maven项目时,将默认的web.xml版本修改为4.0。文章分为七个步骤:1) 找到maven-archetype-webapp jar包的位置;2) 确定该jar包的下载路径;3) 找到maven-archetype-webapp.jar;4) 打开该jar包;5) 删除原有的web.xml;6) 创建一个新的web.xml,编码为UTF-8;7) 将新创建的web.xml放入jar包中。通过这些步骤,用户可以成功修改Maven项目中web.xml的默认版本。

数据库的脏读、不可重复读和幻读

数据库的脏读、不可重复读和幻读

文章主要介绍了数据库事务中的三种常见问题及其对应的隔离级别: 1. **脏读(Dirty Read)**:事务A修改数据但未提交,事务B读取了这些未提交的数据,随后事务A回滚,导致事务B读取到无效数据。 2. **不可重复读(Non-repeatable Read)**:在同一个事务中,事务A两次读取同一行数据,结果不一致,因为事务B在两次读取之间修改了数据并提交。 3. **幻读(Phantom Read)**:事务A两次查询的行数不一致,因为事务B在两次查询之间插入了新的数据并提交。 **隔离级别及解决方案**: - **读未提交**:三种问题都可能发生。 - **读已提交**:解决脏读问题。 - **可重复读**(MySQL默认):解决脏读和不可重复读问题。 - **串行化**:完全解决所有问题,但性能最差。

畅快观影(MoonTV)

畅快观影(MoonTV)

**摘要:** MoonTV 是一个基于 Next.js 14、Tailwind CSS 和 TypeScript 构建的跨平台影视聚合播放器,支持多资源搜索、在线播放、收藏同步等功能。用户可以通过 Docker Compose 轻松部署,配置包括 Redis 存储和自定义环境变量。视频源配置丰富,涵盖爱奇艺、豆瓣、电影天堂等多个资源站点。MoonTV 还支持 PWA 技术,提供离线缓存和移动端原生体验,具备智能去广告功能。项目开源,可在 GitHub 上找到相关代码。

Redis 雪崩场景重现与解决方案

Redis 雪崩场景重现与解决方案

本文详细介绍了Redis雪崩问题的产生原因及解决方案。Redis雪崩是指大量缓存在同一时间失效,导致所有请求直接打到数据库,造成数据库压力骤增甚至宕机的现象。文章首先通过模拟1000个缓存key在10秒后同时失效,并使用多线程模拟高并发请求,重现了雪崩场景。结果显示,缓存失效后,10000个请求全部打到数据库,导致数据库连接池被打满,总请求耗时大幅增加,数据库CPU和IO飙升。 为了解决雪崩问题,文章提出了四种核心方案: 1. **过期时间随机化**:为每个缓存key的过期时间增加随机偏移量,避免集中失效。 2. **互斥锁**:当缓存失效时,只有一个线程去查询数据库,其他线程等待,防止缓存击穿。 3. **缓存预热+永不过期key**:核心数据设置永不过期,并通过后台线程定期更新缓存,避免失效。 4. **限流+降级**:通过信号量限制并发请求数,超出部分直接降级返回默认值,保护数据库。 最后,文章整合了上述方案,形成了一套完整的解决方案,优化后的请求耗时从秒级降至百毫秒级,数据库压力大幅降低。总结指出,雪崩问题的核心在于大量缓存集中失效,解决方案的重点在于避免key集中失效、防止缓存击穿、保护数据库并定期更新缓存。

Java 中的垃圾回收算法

Java 中的垃圾回收算法

本文详细介绍了五种核心垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集和分区收集。标记-清除算法通过标记存活对象并清除未标记对象,简单但会产生内存碎片;标记-复制算法将存活对象复制到新区域,无碎片但内存利用率低;标记-整理算法在标记后整理存活对象,无碎片但耗时较长。分代收集根据对象存活周期分为新生代和老年代,分别采用标记-复制和标记-整理算法。分区收集则通过划分区域减少单次GC停顿时间,适用于大内存应用。各算法的优缺点和适用场景在对比表中清晰呈现。总体而言,垃圾回收算法的目标是高效回收垃圾、减少内存碎片和GC停顿时间。