- 博客(179)
- 资源 (4)
- 收藏
- 关注

原创 浅谈高性能高并发高可用
整个软件的发展历程是一部软件复杂性对抗史,软件的复杂性分为技术复杂性和业务复杂性,业务复杂性主要是建模和抽象设计,技术复杂性主要是三高(高性能,高并发,高可用)的应对,C端的业务一般以技术复杂性为主,业务复杂性为辅,而B端或者M端的业务通常以业务复杂性为主,技术复杂性为辅。本篇文章主要是从后端研发的视角结合自己多年的B、C端系统建设实践谈下三高系统的建设方法论和实践,希望和大家相互交流,共同进步。
2025-01-14 14:05:06
938

原创 jvm-Stop the world
Stop the world 介绍什么是Stop the world?Java中Stop-The-World机制简称STW,Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互。等待所有用户线程进入安全点后并阻塞,做一些全局性操作的行为。在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外)。Stop-The-World对系统性能存在影响,因此垃圾回收的一个原则是尽量减少“Stop-The-World”的时间
2020-07-29 19:55:29
1403

原创 JVM参数调优总结 -Xms -Xmx -Xmn -Xss
“-Xmx1024m -Xms1024m -Xmn512m -Xss256k”——Java运行参数(转)JVM的堆的内存,是通过下面面两个参数控制的-Xms最小堆的大小,也就是当你的虚拟机启动后,就会分配这么大的堆内存给你-Xmx是最大堆的大小当最小堆占满后,会尝试进行GC,如果GC之后还不能得到足够的内存(GC未必会收集到所有当前可用内存),分配新的对象...
2020-04-08 10:17:45
46963
3
原创 浅谈异地多活
无论是高可用计算架构,还是高可用存储架构,其本质的设计目的都是为了解决部分服务器故障的场景下,依然能够保证系统能够继续提供服务。但在一些极端场景下,有可能所有服务器都出现故障。例如,典型的有机房断电、机房火灾、地震、水灾……这些极端情况会导致某个系统所有服务器都故障,或者业务整体瘫痪,而且即使有其他地区的备份,把备份业务系统全部恢复到能够正常提供业务,花费的时间也比较长,可能是半小时,也可能是 12 小时。因为备份系统平时不对外提供服务,可能会存在很多隐藏的问题没有发现。
2025-05-05 06:45:00
998
原创 高可用架构设计——故障响应
查看基于时间序列的监控项的报表,是理解某个系统组件工作情况的好办法,可 以通过几个图表的相关性来初步进行问题根源的判定。这里的日志是广义的,它包括监控系统背后的各类观 测指标的时序数据,以及应用程序的程序日志。通过对关键服务进行定期的故障演练,我们可以在真正的业务故障发生之前识别潜在的弱点和风险点,并制定相应的应对措施。从理论上讲,将故障排查过程定义为反复采用假设 - 验证排除手段的过程:针对某系统的一些观察结果和对该系统运行机制的理论认知,不断提出一个造成系统问题的假设,进而针对这些假设进行测试和排除。
2025-05-05 06:15:00
938
原创 高可用架构设计——服务接口高可用
例如,最常见的数据库慢查询将数据库的服务器资源耗尽,导致读写超时,业务读写数据库时要么无法连接数据库、要么超时,最终用户看到的现象就是访问很慢,一会访问抛出异常,一会访问又是正常结果。假设这个请求的吞吐量为20qps,言下之意,很短的时间内,所有的100个工作线程都会被卡在这个第三方超时等待上,而其他N-1个原本没有问题的接口,也得不到工作线程处理。低优先级的服务通过启动不同的县城或者部署在不同的虚拟机进行隔离,而高优先级的服务则需要部署在不同的物理机上,核心服务和数据甚至需要部署在不同地域的数据中心。
2025-05-04 07:00:00
676
原创 高可用架构设计—降级、限流、资源隔离
通常,动态流控是分级别的,不同级别有不同的流控阈值,系统上线后会提供默认的流控阈值,不同留空因子的流控阈值不同,业务上线之后通常会根据现场的实际情况做阈值调优,因此流控阈值需要支持在线修改和动态生效。如果要保证当服务器宕机时不影响部署在上面运行的服务,需要采用分布式集群部署,而且要采用非亲和性安装:即服务实例需要部署到不同的物理机上,通常至少需要3台物理机,假如单台物理机的故障发生概率为0.1%,则3台同时发生故障的概率为0.001%,服务的可靠性将会达到 99.999%,完全可以满足大多数应用场景。
2025-05-04 06:30:00
798
原创 高性能架构设计-高可用
在大多数情况下,这样的操作是经由一个外部系统来实现的,它会监控实例的健康,并在它们较长时间处于错误状态的情况下,重新启动应用程序。最常见的客户端滥发请求的行为,是配置更新间隔的设置问题。对于稳定性要求很好的关键系统,在成本可接受的情况下,同时维护一套保障主链路可用的备用系统和架构,在核心依赖服务出现问题能做一定时间周期的切换过渡(例如mysql故障,阶段性使用KV数据库等),例如钉钉IM消息核心系统就实现对数据库核心依赖实现一套一定周期的弱依赖备案,在核心依赖数据库故障后也能保障一段时间消息收发可用。
2025-05-03 06:30:00
932
原创 高可用架构设计—补偿与熔断
假如服务提供者出现故障,短时间内无法恢复时,无论是超时重试还是双发不但不能提高服务调用的成功率,反而会因为重试给服务提供者带来更大的压力,从而加剧故障。针对这种情况,就需要服务消费者能够探测到服务提供者发生故障,并短时间内停止请求,给服务提供者故障恢复的时间,待服务提供者恢复后,再继续请求。这就好比一条电路,电流负载过高的话,保险丝就会熔断,以防止火灾的发生,所以这种手段就被叫作“熔断”。简单来讲,熔断就是把客户端的每一次服务调用用断路器封装起来,通过断路器来监控每一次服务调用。
2025-05-03 06:30:00
751
原创 高性能架构设计-高性能可伸缩架构
系统是一个整体,如果只是节点级别的伸缩,可能要对多个节点分别进行操作,而且不同节点的资源配置会相互影响,这样对各个节点的调整就非常复杂,影响了系统 的可伸缩能力。系统处理请求不一定要实时同步,请求流量的高峰期时间往往很短,所以有些时候,可以延长系统的处理时间,只要在一个相对合理的时间内,系统能够处理完请求就可以了,这是一种异步化的处理方式。系统的可伸缩也有两种实现方式。:异步处理给系统的处理增加了弹性空间,可以利用更多的处理时间,来降低系统对资源 的实时需求,在保证系统处理能力的同时,降低系统的成本。
2025-05-02 07:00:00
531
原创 高性能网站高可用架构-设计基础及FMEA简介
高可用的大前提:所有事物都不是100%可靠的从人的层面:人都是有可能犯错的。从软件层面:软件都是有可能有BUG的。从硬件层面:硬件都是有可能会坏的。不可抗力:地震,水灾,火灾FMEA(Failure mode and effects analysis,故障模式与影响分析)又称为失效模式与后果分析、失效模式与效应分析、故障模式与后果分析等,专栏采用“故障模式与影响分析”,因为这个中文翻译更加符合可用性的语境。
2025-05-02 07:00:00
693
原创 高性能架构设计-高性能缓存
缓存提升性能的幅度,不只取决于存储介质的速度,还取决于缓存命中率。为了提高命中 率,缓存会基于时间、空间两个维度更新数据。在时间上可以采用 LRU、FIFO 等算法淘汰 数据,而在空间上则可以预读、合并连续的数据。如果只是简单地选择最流行的缓存管理 算法,就很容易忽略业务特性,从而导致缓存性能的下降。
2025-05-01 07:15:00
1935
原创 高性能架构设计-NOSQL基础
(1)关系数据库存储的是行记录,无法存储数据结构以微博的关注关系为例,“我关注的人”是一个用户 ID 列表,使用关系数据库存储只能将列表拆成多行,然后再查询出来组装,无法直接存储一个列表。(2)关系数据库的 schema 扩展很不方便。
2025-05-01 07:00:00
624
原创 高性能架构设计-分库分表
如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。单表行数超过1000万行或者单表容量超过4GB,才推荐分库分表。
2025-04-30 16:31:50
739
原创 高性能架构设计-数据库(读写分离)
读写分离:将访问压力分散到集群中的多个节点,没有分散存储压力分库分表:既可以分散访问压力,又可以分散存储压力。
2025-04-30 16:29:55
980
原创 网站高性能架构设计——池化
JDK 1.5 中引入的 ThreadPoolExecutor 就是一种线程池的实现,它有两个重要 的参数:coreThreadCount 和 maxThreadCount如果线程池中的线程数少于 coreThreadCount 时,处理新的任务时会创建新的线程;如果线程数大于 coreThreadCount 则把任务丢到一个队列里面,由当前空闲的线程执 行;当队列中的任务堆积满了的时候,则继续创建线程,直到达到 maxThreadCount;
2025-04-26 07:15:00
462
原创 网站高性能架构设计——web前端
动静分离”就是把用户请求的数据(如 HTML 页面)划分为“动态数据”和“静态数据”。简单来说,“动态数据”和“静态数据”的主要区别就是看页面中输出的数据是否和 URL、浏览者、时间、地域相关,以及是否含有 Cookie 等私密数据。很多媒体类的网站,某一篇文章的内容不管是你访问还是我访问,它都是一样的。所以 它就是一个典型的静态数据,但是它是个动态页面。如果现在访问淘宝的首页,每个人看到的页面可能都是不一样的,淘宝首页中包含 了很多根据访问者特征推荐的信息,而这些个性化的数据就可以理解为动态数据了。
2025-04-25 07:15:00
547
原创 架构设计基础
迭代的过程就是一个否定之否定的过程,随着分解的逐步推进或系统的架构演化,后面的分解除了会识别出新的架构元素,也可能会对先前识别出的架构作出调整。有了 TP99 这样的概念,就可以定义系统的 SLA 了,SLA 是 Service-Level Agreement, 它是系统对于它的客户所承诺的可以提供的服务质量,既包括功能,也包括性能。应该认真分析当前业务的特点,明确业务面临的主要问题,针对核心需求,设计合理的架构,快速落地以满足业务需要,然后在运行过程中不断完善架构,不断随着业务演化架构。
2025-04-25 06:45:00
1422
原创 网站高可用架构设计基础——高可用策略和架构原则
在大多数情况下,这样的操作是经由一个外部系统来实现的,它会监控实例的健康,并在它们较长时间处于错误状态的情况下,重新启动应用程序。最常见的客户端滥发请求的行为,是配置更新间隔的设置问题。对于稳定性要求很好的关键系统,在成本可接受的情况下,同时维护一套保障主链路可用的备用系统和架构,在核心依赖服务出现问题能做一定时间周期的切换过渡(例如mysql故障,阶段性使用KV数据库等),例如钉钉IM消息核心系统就实现对数据库核心依赖实现一套一定周期的弱依赖备案,在核心依赖数据库故障后也能保障一段时间消息收发可用。
2025-04-24 19:49:52
894
原创 网站高可用架构设计——监控理论简介
监控体系首先要保障一定能发现异常,如果监控无法发现异常一切都没有意义。快速发现异常:也就是要保障监控的时效性,监控和报警的响应速度直接影响故障的恢复速度。好的监控一定要保证快速发现问题。快速定位问题:在快速发现问题的基础上,优秀的监控体系还应该能迅速定位问题的根源。不仅仅是识别问题,更重要的是能够指出问题的具体位置。给出影响评估:对于大规模故障,监控体系不仅要能发现和定位问题,还应能提供准确的影响评估。
2025-04-24 19:48:06
1107
原创 服务远程调用组件 Spring Cloud Feign 架构原理及用法
最后总结一下,Feign 是一个轻量级的 HTTP 客户端框架,使用者能够以一种更简洁、易于维护的方式来实现 HTTP 服务请求。与原生 Feign 组件相比,Spring Cloud Feign 还扩展了对 Spring MVC 注解的支持,同时还整合了 Ribbon 提供客户端的负载均衡实现,以及 Hystrix 服务熔断器。传统的模式下,当我们要对某个接口发起 HTTP 请求时,首先会封装 HTTP 请求报文,然后发起请求,最后处理响应结果。,通过定义的 feign 客户端来调用服务提供方的接口。
2025-04-23 06:45:00
921
原创 SpringCloud 整合 Nacos 构建分布式服务注册中心
Nacos 可以作为统一的服务配置中心,连接各个业务微服务,实现对各个微服务的配置文件进行集中式管理,同时也可以在运行时动态更新配置信息,而无需重新启动微服务。根据上文的架构图所示,Nacos 的集群部署完成之后,我们还需要一个统一的入口用来维护 Nacos 的访问,能用的组件有很多种,比如 DNS、Nginx 等,以此来实现 Nacos 的负载均衡访问。对于要求高可用的服务,通常会采用 3 个及以上的节点来部署,Nacos 也不例外,集群架构图可以用如下图来描述。下载完成之后,解压。
2025-04-23 06:00:00
827
原创 使用Nacos 打造微服务配置中心
Nacos 作为服务注册中心的使用方式,同时 Nacos 还可以作为服务配置中心,用于集中式维护各个业务微服务的配置资源。作为服务配置中心的交互流程图如下。这样设计的目的,有一个明显的好处就是:有利于对各个微服务的配置资源进行统一维护和管理,尤其是要更新某个配置参数时,能避免大量人肉运维工作。今天通过一些案例我们一起来了解一下,如何使用 Nacos 来实现服务配置中心的管理。
2025-04-22 16:40:50
1293
原创 mermaid绘图的语法详细
Mermaid 是一种基于文本的绘图工具,可通过简单的文本描述生成流程图、序列图、甘特图等多种类型的图表。以下是对其常见绘图类型语法的详细介绍:Mermaid 是一种基于文本的图表生成工具,支持多种图表类型(如流程图、序列图、甘特图等)。
2025-04-22 09:24:43
1280
原创 如何开一个线上故障复盘会
线上故障复盘会是团队总结经验、优化流程的重要环节,开好复盘会需要聚焦问题根源、避免甩锅文化、推动改进落实。复盘不是甩锅大会,是总结大会。
2025-04-18 15:36:11
337
原创 深入理解分布式缓存 以及Redis 实现缓存更新通知方案
分布式缓存:指将应用系统和缓存组件进行分离的缓存机制,这样多个应用系统就可以共享一套缓存数据了,它的特点是共享缓存服务和可集群部署,为缓存系统提供了高可用的运行环境,以及缓存共享的程序运行机制。轻量级实时通知:选择Pub/Sub,代码简单,适合对可靠性要求不高的场景(如社交动态更新)。高可靠消息队列:选择,适合订单状态同步、库存扣减等关键业务。扩展方案:若需严格保证缓存与数据库一致性,可结合MySQL Binlog 监听(如 Canal)同步到 Redis。
2025-04-18 15:06:43
699
原创 RocketMQ 的详细使用教程
RocketMQ 的核心使用流程包括安装部署、Topic 管理、消息生产与消费,高级功能涵盖事务消息、延迟消息和高可用集群配置。实际应用中需根据业务场景选择刷盘策略(同步/异步)和复制方式(同步/异步主从),并结合控制台监控优化性能。在两台服务器上分别部署 NameServer 和 Broker,配置文件。:RocketMQ 的注册中心。
2025-04-18 15:04:08
1215
原创 Seata方案详细
Seata 通过灵活的四种模式(AT、TCC、Saga、XA)覆盖了分布式事务的不同需求,结合 TC 的统一协调,实现了事务的高可用与易用性。
2025-04-17 17:29:18
1027
原创 分布式事务解决方案—本地消息表
本地消息表方案通过结合本地事务与异步消息,在保证可靠性的同时实现系统解耦,是分布式事务中平衡复杂度与一致性的优选方案。实际应用中需结合业务场景,合理设计消息表结构、重试策略及补偿机制,以确保系统的最终一致性和高可用性。(1)本地消息表通过在数据库中维护一张专门的消息表来管理与外部系统的交互状态更新,由于消息表的写入是与业务操作同在一个本地事务中完成的,天然具有同时成功和同时失败的特性。
2025-04-17 14:11:20
1404
原创 ES不香吗,为啥还要ClickHouse?
Elasticsearch 是一个实时的分布式搜索分析引擎,它的底层是构建在 Lucene 之上的。简单来说是通过扩展 Lucene 的搜索能力,使其具有分布式的功能。ES 通常会和其它两个开源组件 Logstash(日志采集)和 Kibana(仪表盘)一起提供端到端的日志/搜索分析的功能,常常被简称为 ELK。Clickhouse 是俄罗斯搜索巨头 Yandex 开发的面向列式存储的关系型数据库。ClickHouse 是过去两年中 OLAP 领域中最热门的,并于 2016 年开源。
2025-04-16 10:21:16
805
原创 10张图全面总结 MCP、A2A、Function Calling 架构设计间关系
MCP 的扩展性则通过统一的接口标准,将复杂的 M(个模型)×N(个外部工具对接)问题转化为 M+N 的问题。目前,MCP 生态已经得到了广泛的支持,包括 Anthropic 的 Claude 系列、OpenAI 的 GPT 系列、Meta 的 Llama 系列、DeepSeek、阿里的通义系列以及 Anysphere 的 Cursor 等主流模型均已接入 MCP 生态。从大模型本身,到为大模型添加工具调用功能,再到大模型与工具的交互标准,最后到 AI Agent 之间的通信协议,这一系列的发展就像是。
2025-04-16 10:18:45
1593
原创 关于数据中台的深度思考与总结
•同一种计算引擎,不同厂商的权限系统有多种,例如Hadoop自身无数据权限系统,由不同厂商各自去实现,目前主要有两种策略:•RBAC(Role-Based Access Control):如Cloudera用的是Sentry,华为的FI也是类似的机制•PBAC(Policy-Based Access Control):如Hortonworks用的Ranger•数据权限是由大数据集群或数据库运维人员管理的,开发人员无法直接操作或者接触,所有的权限申请都需要运维人员开通,造成运维人员负担过重。
2025-04-15 07:15:00
1252
原创 都在建议你不要直接使用 @Async 注解,为什么?
同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。例如, 在某个调用中,需要顺序调用 A, B, C三个过程方法;如他们都是同步调用,则需要将他们都顺序执行完毕之后,方算作过程执行完毕;如B为一个异步的调用方法,则在执行完A之后,调用B,并不等待B完成,而是执行开始调用C,待C执行完毕之后,就意味着这个过程执行完毕了。
2025-04-15 06:45:00
778
原创 性能高、上手快,实体类转换工具 MapStruct 到底有多强大!
有时候,对于某些类型,无法通过代码生成器的形式来进行处理。那么, 就需要自定义的方法来进行转换。这时候,我们可以在接口(同一个接口,后续还有调用别的 Mapper 的方法)中定义默认方法(Java8及之后)。
2025-04-14 07:45:00
738
原创 SpringBoot整合ELK-Elastricsearch + LogStash + Kibana
ELK实际上是三个工具,Elastricsearch + LogStash + Kibana,通过ELK,用来收集日志还有进行日志分析,最后通过可视化UI进行展示。一开始业务量比较小的时候,通过简单的SLF4J+Logger在服务器打印日志,通过grep进行简单查询,但是随着业务量增加,数据量也会不断增加,所以使用ELK可以进行大数量的日志收集和分析「在环境配置中,主要介绍Mac和linux配置,windows系统大致相同,当然,前提是大家都安装了JDK1.8及以上版本~」 注意高版本的ELK同样需
2025-04-14 07:00:00
1102
原创 Embed.ly 介绍与实践──让内容嵌入变得简单
嵌入确实是一个很有用的功能,无论是对于内容提供者,还是内容消费者来说,都极大的提高了接入效率,与此同时,也让我们的网页变得丰富多样。现在,回到文章开头,Embed.ly 到底是什么?想必大家都有了答案。最后,我们来梳理一下 Embed.ly 存在的意义:极大的提高了内容提供者的接入效率,无需内容提供者分别去与各个内容消费者对接。在将每个提供者的站点列入白名单之前,先对其进行测试,以确保它们正确实施了规范。保证了嵌入的质量。缓存提供者的 JSON 响应。
2025-04-13 06:30:00
938
原创 Rocksdb KV分离存储实践
这个要从一篇论文说起 —— 《WiscKey》。我们知道 Rocksdb 中,key 和 value 是存在一起的,该论文提出了一种优化思路:在 LSM-tree 上做 key 和 value 分离存储。如下图:该论文的思想比较好理解,就是将 key 和 value 对应的索引存 LSM-tree 中,将真正的 value 存在另一个文件中。目前 KV 分离存储方案已经应用到了喜马拉雅的 XCache 存储系统中,大大降低了大 value 场景下的延时问题。
2025-04-13 06:00:00
942
原创 Unicorn 如何快速定位性能问题
首先先来说一下为什么我们要做这样一个数据可视化平台,主要有以下几个方面:产品是否免费Ops账号登录、细分权限易上手公司计算引擎集成Tableau❌❌✅❌网易有数❌❌✅❌Excel❌❌✅❌Unicorn✅✅✅✅由于有上面这些业务场景,我们便开始搭建属于喜马拉雅的一个数据可视化平台。1、echart实例在路由切换,前面一个组件已经销毁后,并没有释放掉。2、detached的dom没有被回收的问题。3、部分event listener没有被及时回收。
2025-04-12 07:00:00
791
DeepSeek:从入门到精通-清华大学团队打造的强大国产开源AI推理模型
2025-03-26
propties配置管理jar
2018-01-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人