自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(96)
  • 收藏
  • 关注

原创 Kafka存储机制核心优势剖析

相同7200转HDD,Kafka顺序写吞吐可达600MB/s,而随机写仅约100KB/s ——Kafka将内存管理权交给OS内核,规避JVM GC开销,同时通过。Kafka跳过JVM堆,直写Page Cache,从根源消除冗余。,这正是其成为大数据管道核心的基石。最大化磁盘IOPS(机械盘可达600MB/s,SSD更高)⚠️ 性能下降约50%,仅用于金融级场景。稳定小于内存10%时,系统处于健康状态。,是Kafka碾压传统MQ性能的关键。Producer写入。Broker接收数据。Consumer读取。

2025-06-05 10:35:18 1142

原创 Kafka深度解析与原理剖析

当Leader切换时,新Leader会将其HW设置为当前LEO,Follower比较自身HW与Leader的HW,将本地日志截断到HW位置,确保数据一致。:可直接在服务器上观察(如Broker进程、/tmp/kafka-logs下的Segment文件):新集群优先采用KRaft模式,Kafka 3.0+已支持生产可用。:无直接物理映射,通过Broker协调实现逻辑功能。(如Partition)实现水平扩展与并行处理,启用压缩,Broker保持压缩状态存储。(如Broker)提供实际服务能力,

2025-06-05 10:31:06 1224

原创 Nginx实现用户维度路由到特定网关的方法(二)

通过Nginx的用户ID哈希路由和本地限流高效用户维度治理:减少分布式存储依赖,提升限流性能。会话粘性:确保同一用户请求集中,简化限流状态管理。多层防护:接入层(Nginx)过滤高频请求,网关层(Spring Cloud Gateway)细化服务级限流,形成完整流量治理体系。适用场景高并发用户场景(如电商秒杀、社交API),需对用户请求频率严格控制。网关集群部署,通过流量分片提升限流效率和缓存利用率(如同一用户的请求在网关本地缓存命中)。配置建议优先使用进行用户分片,增强网关集群的扩展性。

2025-05-26 11:22:59 775

原创 Nginx 限流机制:请求速率与连接数限制深度解析(一)

请求速率限制:适用于高频短连接场景(如 REST API),通过漏桶算法平滑流量,burst和nodelay灵活处理突发。连接数限制:适用于长连接或批量连接场景(如 WebSocket、爬虫),直接限制资源占用。最佳实践对静态资源(如图片、CSS)优先限制连接数(减少无效连接),动态接口限制请求速率。结合fail2ban等工具,对频繁触发限流的 IP 进行封禁,增强安全防护。与应用层限流(如 Sentinel)协同,形成从接入层到服务层的多层限流体系。

2025-05-26 11:18:43 1061

原创 Spring Cloud Gateway 限流实践:基于 Redis 令牌桶算法的网关层流量治理

在微服务架构中,API 网关作为流量枢纽,需对进入系统的请求进行精细化限流,以保护下游服务免受流量冲击。Spring Cloud Gateway 结合 Redis 实现的令牌桶算法,为网关层限流提供了高效、分布式的解决方案。本文将深入解析其原理、配置及实践优化。2. Redis 连接配置()3. 定义限流维度()4. 网关路由与限流配置()5. 自定义限流响应(全局异常处理)四、高级特性与优化1. 动态限流参数通过配置中心(如 Nacos)动态更新限流参数,实现热更新:2. 多维度组

2025-05-26 11:08:09 1075

原创 系统架构中的限流算法(一)

经过上述的描述,好像漏桶、令牌桶比时间窗口类算法好多了,那么时间窗口类算法是不是就没啥用了呢?其实并不是,虽然漏桶、令牌桶对比时间窗口类算法对流量的整形效果更好,但是它们也有各自的缺点,例如令牌桶,假如系统上线时没有预热,那么可能会出现由于此时桶中还没有令牌,而导致请求被误杀的情况;而漏桶中由于请求是暂存在桶中的,所以请求什么时候能被处理,则是有延时的,这并不符合互联网业务低延时的要求。所以令牌桶、漏桶算法更适合阻塞式限流的场景,即后台任务类的限流。

2025-05-26 09:33:03 1093

原创 系统架构中的限流实践:构建多层防护体系(二)

在系统架构中,限流可以从多个层面实施,不同层面的限流策略互补,形成多层防护体系。通过多层防护,可有效应对流量突发、恶意攻击或系统过载等场景,提升架构稳定性。:从资源层面限制应用的CPU、内存、网络带宽等,防止单个服务占用过多资源。:在分布式系统中统一控制全局流量,解决单体应用限流的一致性问题。:在离用户最近的边缘节点拦截恶意流量或高频请求,减轻源站压力。:针对具体服务或接口的细粒度流量控制,保护应用逻辑和资源。:保护数据库、缓存等底层存储,避免被高频请求压垮。:在请求发起端控制频率,减少无效请求到达后端。

2025-05-26 09:28:00 923

原创 DNS Server在高可用高并发系统中的应用

在高可用高并发系统中,DNS Server(域名系统服务器)不仅承担基础的域名解析功能,还通过智能调度、流量分发、容灾切换等机制深度融入架构设计,成为提升系统性能与稳定性的核心组件。在实际设计中,需将 DNS 与反向代理、服务网格(如 Istio)、云原生调度工具(如 Kubernetes)结合,形成 “全局 - 局部 - 进程内” 的多级流量控制体系,最终实现系统的高性能、高可用性与可扩展性。容灾基石:作为多活架构的底层支撑,实现跨机房故障切换的自动化与标准化。

2025-05-24 23:58:55 765

原创 一文搞懂主从复制和读写分离

主从复制 vs 读写分离主从复制是底层数据同步机制,读写分离是上层架构设计。读写分离必须依赖主从复制,但主从复制不一定需要读写分离。两者是复制的“配置方法”,GTID 是对 Binlog 的增强,用于简化运维。中间件选择若只需读写分离,用 ProxySQL。若需分库分表,用 ShardingSphere。

2025-05-21 21:45:44 892

原创 数据库中间件分类与核心组件解析

数据库中间件根据实现层级和代理方式,可分为两大类:DBProxy(服务端代理) 和 JDBCProxy(客户端驱动代理)。两者的核心区别在于流量处理的位置和对应用的侵入性。核心定位:作为独立的中间层服务,部署在应用服务器与数据库之间,代理所有数据库请求,对应用层透明(应用无需修改代码,仅需连接中间件地址)。技术特点:代表组件:核心定位:通过修改JDBC驱动或实现特定协议,将路由逻辑嵌入应用程序的数据库连接层,无需独立中间件服务。技术特点:代表组件:选型建议:DBProxy的负载均衡JDBCProxy的负载均

2025-05-21 10:49:23 571

原创 数据库架构设计方案整理

数据库层面将大表按规则拆分为多个子分区(物理上仍是同一张表),对应用层透明,开发无需修改业务逻辑。

2025-05-21 10:37:41 640

原创 分库分表的适用场景及演进过程

分库分表的核心目标是通过数据分布优化存储与性能,但需权衡复杂度与收益。

2025-05-19 10:59:08 656

原创 分布式与集群:概念、区别与协同

分布式与集群是云计算和分布式系统中的两个核心概念,尽管常被混淆,但它们在设计和应用上存在本质区别。分布式强调任务逻辑上的解耦,通过将业务拆分为多个子任务并在不同节点上执行,解决高性能、高并发和可扩展性问题,典型应用包括微服务架构(如Dubbo)和大数据处理(如Hadoop)。集群则侧重于物理资源的冗余,通过将同一业务部署在多个服务器上,实现高可用性、负载均衡和计算能力,典型场景包括数据库主从集群和Web服务器集群。两者在实际应用中常协同工作,分布式系统依赖集群保障可靠性,而集群技术支撑分布式任务的执行。

2025-05-19 10:57:59 830

原创 沈剑-架构师训练营

假设,某业务日均 QPS 为2000,业务访问趋势图如下图,求峰值 QPS 预估?push 落地页系统 30 分钟的总访问量是 500w,平均 QPS 是多少?答:从图中可以看出,峰值 QPS 大概是均值 QPS 的2.5倍。假设,某信息分类网站首页日均PV约8000w,平均QPS是多少?日均 QFS 为2000,于是评估出峰值 QPS 为5000。假设,公司要做一个APP-push的运营活动。答:一天按照 4w秒 算,,大概 2000QPS。

2024-12-17 17:40:10 302

原创 RocketMQ面试题合集

这种Master-Slave模式不是彻底的高可用模式,他没法实现自动把Slave切换为Master。在RocketMQ 4.5之后,这种情况得到了改变,因为RocketMQ支持了一种新的机制,叫做Dledger(基于Raft协议)

2024-12-10 12:37:01 540

原创 反向代理-缓存篇

然而,在此期间若服务器端的资源被修改,页面将无法获取到最新资源,因为此时不会再向服务器发送请求,而是直接使用本地缓存的数据。再将该过期时间与当前时间进行比较,若请求时间在过期时间之前,则能命中缓存,否则不行。若未过期,则直接从本地缓存中获取资源,不会向服务器再次发起请求;如果时间不一致,就返回HTTP状态码200和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示到浏览器中。协商缓存是在强制缓存失效后,浏览器携带缓存标志向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程。

2024-12-09 14:33:16 1011

原创 openresty+lua

直接访问文件,IO耗时长levels=1:21:2keys_zonetmp_cache100minactive。

2024-12-09 09:11:01 780

原创 Redis 面试题合集

给缓存设置过期时间,定期清理缓存并回写,是保证最终一致性的解决方案我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即可。也就是说如果数据库写成功,缓存更新失败,那么只要到达过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存,达到一致性,切记,要以数据落库DB为准TTL随机数分散降低机率Redis宕机:利用集群提高服务的可用性快速失败、拒绝服务一人一单在单机运行的情况下且synchronized会保证线程任务顺序执行;

2024-12-06 10:53:34 1383 1

原创 Spring源码解读

为了便于对象依赖注入的配置管理,Spring 容器在启动时就必须将所有用到的 Bean 实例保存在容器之中,这样就可以依靠BeanFactory 接口提供的方法获取指定的 Bean 实例,但是在一些开发的场景中,除了 Bean 本身的需求之外,也需要一些额外的配置信息,例如:同一类型的 Bean 存在的数量、容器中包含的 Bean 数量、使用指定注解 Bean 的信息等。通过IDEA的开发提示,可以发现通过AbstractRefreshableApplicationContext这个子类可以实现该方法;

2024-12-05 17:54:50 1045

原创 论属性赋值和setter赋值的区别

以下是几个具体的例子,用以说明直接赋值在业务逻辑变复杂时难以满足需求,而使用set。

2024-12-03 11:19:58 490 1

原创 HashMap面试题汇总

一般情况下,HashMap底层使用数组+链表,当数据量非常大时,长度大的链表(大于8)自动转成红黑树,此时,HashMap底层使用数组+链表+红黑树。至于这个阈值是系统设置的。当链表长度降到6时就自动转换回链表。通常情况下不会使用红黑树,当数据量较小时,如何强制使用红黑树,不但不能提高效率,反而耗费内存空间。只有当数据量非常大时,使用红黑树才能更好地提高效率。

2024-11-27 19:40:21 862

原创 从0开始学习JVM

C语言申请内存:malloc freec/C++ 手动回收内存Java: new?忘记回收多次回收没有任何引用指向的一个对象或者多个对象(循环引用)根据需求进行JVM规划和预调优优化运行JVM运行环境(慢,卡顿)解决JVM运行过程中出现的各种问题(OOM)

2024-11-27 19:34:06 1119

原创 MySQL面试合集

MVCC 全称是多版本并发控制系统,InnoDB 和 Falcon 存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决幻读问题。

2024-11-19 20:45:15 739

原创 IronPython和C#交互

首先,确保你的项目中已经安装了IronPython。可以通过NuGet包管理器来安装IronPython。: 在C#代码中,你需要创建一个实例,这是IronPython执行环境的核心。: 使用实例来加载和执行Python脚本。在C#中调用Python的Tkinter库,你需要使用IronPython,因为Tkinter是Python的标准GUI库,而IronPython是一个Python实现,它可以运行Python代码并与之交互。: 确保你的项目中已经安装了IronPython。

2024-05-26 08:27:01 1033 1

原创 Android Studio学习笔记

【代码】解决Android Studio Gradle下载慢的问题。

2024-05-14 19:01:34 1567

原创 NextJS 用法笔记

NextJS用法笔记500notFoundfetcher use axios设置state-useSWR时重新渲染过多获取路由参数本地开发dev环境Redux Toolkit: extraReducerstypescript axios config.headers 未定义500import Error from 'next/error'export async function getServerSideProps() { const res = await fetch('https://ap

2024-04-30 14:45:13 835

原创 一文搞懂前端模块化的演进与发展

随着Web技术的不断进步,前端模块化已成为现代Web开发不可或缺的一部分。本文将探讨前端模块化的历史演进,特别是ES Module(ESM)的崛起及其对未来前端开发的影响。

2024-04-07 10:21:25 1024

原创 【NestJS 编程艺术】4. 探索NestJS的高效开发:一切皆module

控制器负责处理客户端请求,并将请求委托给服务层(步骤3要创建的)处理。以下为命令行生成一个用户控制器。@Get()通常我们的业务逻辑都写在service层,进行数据库增删改查的逻辑操作或其他外部服务进行交互。然后,我们创建一个服务,它将包含业务逻辑。// 这里可以是数据库查询或其他业务逻辑,可以通过 ORM 工具进行查询数据库的操作,并返回 User 列表;// 下一篇会介绍 TypeORM 的接入全局模块、共享模块和动态模块为 NestJS 应用程序提供了更灵活的模块化策略。

2024-03-20 16:31:18 984

原创 如何在SQL中优雅地处理发货状态逻辑

在处理订单管理系统时,了解订单的发货状态是至关重要的。我们经常需要从数据库中提取有关发货状态的信息,并据此做出状态匹配。在这篇文章中,我们将探讨如何使用SQL的高级功能来优雅地处理发货状态逻辑,并提供一个清晰、可维护的解决方案。

2024-03-18 10:58:15 647

原创 第一章:网络协议的奥秘

网络协议是通信设备之间共同遵守的规则和约定,它们定义了数据传输的格式、顺序和错误处理机制。通过这些规则,不同的计算机系统能够相互理解和交换信息,就像使用同一种语言进行对话一样。

2024-03-16 16:59:26 872

原创 【前端·每日一题】面试官:说下HTTP请求体有几种?

在与服务器通信时,HTTP请求体是信息传递的核心。无论是提交表单、上传文件,还是与API交互,正确地构造和解析请求体对于确保数据的准确传递至关重要。以下是四种常见的HTTP请求体格式在实际前端开发中的应用示例,以及实际开发过程中会用到的第三方库

2024-03-16 15:45:38 728

原创 【NestJS 编程艺术】3. 探索NestJS的高效开发:nest-cli的全面指南

在现代的 Node.js 服务端开发中,NestJS 以其优雅的架构和强大的功能集成为了开发者的首选框架之一。而这一切的起点,都始于@nestjs/cli这个强大的命令行工具。

2024-03-13 17:27:20 1403

原创 【NestJS 编程艺术】2. Nest.js 入门指南:创建你的第一个 Nest.js 应用程序

Nest.js 是一个用于构建高效、可靠和可扩展的服务器端应用程序的框架。跟随本【NestJS系列开发实战】教程,一步步全链路构建自己的服务应用。

2024-03-12 16:59:58 580

原创 【NestJS 编程艺术】1. NestJS设计模式深度解析:构建高效、可维护的服务端应用

在当今快速发展的软件开发领域,Node.js凭借其轻量级和高性能的特点,已经成为了构建服务端应用的首选技术之一,其中竞争优势最大的当属NestJS框架。

2024-03-12 16:59:06 1673

原创 探索React未来:预期特性与开发者前瞻

React 19的发布预示着前端开发领域的一次重大进步。本文将深入探讨React 19的核心新特性,包括新的Hooks、编译器优化、以及对数据获取和表单处理的改进。

2024-03-08 09:58:00 1760

原创 解决@vueup/vue-quill图片上传、视频上传问题

【代码】解决@vueup/vue-quill图片上传、视频上传问题。

2023-09-18 12:11:48 1046

转载 解决Intel平台AS启动报错:Gradle Sync Failed:Tag mismatch!

编辑这个文件:.gradle/gradle.properties 加入下面配置

2023-02-04 13:55:58 620

转载 JS Vue React 面试题

React为什么用keyReact生命周期React父子组件生命周期mountComponent负责管理生命周期中的mounting阶段的方法调用mountComponent本质上是通过递归渲染内容的,由于递归的特性,父组件的componentWillMount在其子组件的componentWillMount之前调用,而父组件的componentDidMount在其子组件的componentDidMount之后调用updateComponent负责管理生命周期中的upda

2023-01-30 18:33:49 312

原创 wget curl post请求

wget curl post请求

2022-12-19 11:23:27 2842

原创 React18 引入 [email protected] 报错解决

pdfjs-dist在react18中的应用填坑

2022-11-29 21:50:56 1645

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除