【架构】架构设计
文章平均质量分 91
JAVA前线
微信公众号「JAVA前线」
展开
-
技术系统出现故障怎么定责?法学家、经济学家与商人的三种思路
在技术工作中难免会遇到线上故障,那么如果出现了线上故障,如何定责才能避免后续再次出现类似故障?这是一个问题。在刘润老师《底层逻辑》这本书中,第一章节《是非对错的底层逻辑》提到了三种对错观,分别是法学家经济学家商人的对错观,这三种思路对于技术工作中定责有一定借鉴作用。原创 2024-05-25 10:57:16 · 483 阅读 · 0 评论 -
MySQL乐观锁扣减库存原理图解
欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习1 基础知识在电商系统中扣减库存是一步非常关键的操作,例如秒杀系统中一定要防止超卖情况出现,如果商家设置了100件库存但是最后卖出1000件,这样就会产生资金损失。在扣减库存时一般使用如下语句:udpate goods set stock = stock - #{acquire} where sku_id = #{sk.原创 2021-12-29 07:57:53 · 1248 阅读 · 1 评论 -
复杂、繁杂、庞杂:图解七种代码耦合类型
欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习1 复杂、繁杂、庞杂在开发工作中我们经常会听到:这个业务很复杂,这个系统很复杂,这个逻辑很复杂,只要是处理遇到困难的场景,似乎都可以使用复杂这个词进行描述。但是我认为困难之所以困难,原因还是有所不同的,不能用复杂这个词笼而统之,有加以区分的必要。大体上我认为可以分为复杂、繁杂、庞杂三个类型。复杂和繁杂二者均包含分支多和逻.原创 2021-12-11 10:51:59 · 3976 阅读 · 2 评论 -
架构权衡评估方法(ATAM):如何评估一个系统的质量
欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习1 质量属性在系统设计和开发过程中,我们比较容易关注系统的功能维度,例如有没有实现预期功能,输入参数和输出参数是否匹配等等,这是比较容易衡量的。但是我们不能就此止步,因为满足功能是系统的基本要求,还需要关注系统的非功能维度,例如系统性能是否优秀,代码可扩展性如何,出现异常是否可以自动降级等等,这些指标决定了系统能否提供高.原创 2021-11-07 13:55:45 · 8760 阅读 · 0 评论 -
长文多图:结合DDD讲清楚编写技术方案的七大维度
欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习1 为什么要写技术文档回顾软件开发历史,我们可以将其分为程序设计时代、程序系统时代和软件工程时代三大历史阶段。在程序设计时代(1946-1956),软件开发主要依赖于个人编程技巧,技术文档只要存在个人开发者的大脑即可,因为没有沟通和协作需要,编写技术文档也不具有紧迫性。在程序系统时代(1956-1968),计算机性能显著.原创 2021-10-01 21:47:28 · 711 阅读 · 0 评论 -
多图详解:如何不停服分库分表
欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习1 理论知识1.1 分库分表是否必要分库分表确实可以解决单表数据量大这个问题,但是并非首选。因为分库分表至少引入了三个必须解决的突出问题。第一是分库分表方案本身具有的复杂性。第二是本地事务失效问题,原本在同一个数据库中可以保证强一致性业务逻辑,分库之后事务失效。第三是难以聚合查询问题,因为分库分表后查询条件中必须带有s.原创 2021-08-30 12:57:39 · 612 阅读 · 1 评论 -
从横向和纵向两个维度寻求复杂问题的答案
欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习1 多维度思维在知乎上看到了这个有意思的问题:一头牛重800公斤,一座桥承重700公斤,牛应该怎么过桥。初看题目我们不难得出两个方案:桥梁加固、等待牛体重降至700公斤。这两个方案显然是正确的,但是我们不能就此止步。因为这类问题考察的是思维方法论,直接给出答案反而不是最重要的,对于这个问题我们可以从合理性、结构化、可行性三.原创 2021-08-21 22:35:57 · 1961 阅读 · 0 评论 -
面试题:一头牛重800公斤,一座桥承重700公斤,牛应该怎么过桥
欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习1 问题分析在知乎上看到了这个有意思的问题,首先这个问题不是为了考察建筑工程学知识,因为面试者并非都具有建筑工程学经验。我认为这个问题是在考察三种分析方法:合理性分析、结构化分析、可行性分析。2 合理性分析在职场上是允许争论需求和问题合理性的,拒绝掉一个不合理的需求,其实也是在节约资源和成本。例如产品经理提出业务需.原创 2021-08-07 10:57:49 · 5575 阅读 · 1 评论 -
十张图讲清楚DDD建模六个问题与六个步骤
欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,欢迎大家加我微信「java_front」一起交流学习0 文章概述领域驱动设计DDD是一段时间以来比较流行的概念,但是在使用时觉得概念很多难以落地。本文就来探讨DDD落地时需要关注的六个问题,并通过一个足球运动员信息管理系统案例分析落地的六个步骤。1 六个问题1.1 为什么使用DDD方法论的核心是将问题不断分解,把大问题分解为小问题,大业务分解小领域,简而言之就是分而治之,各.原创 2021-04-12 12:59:07 · 1479 阅读 · 0 评论 -
面试官问如何动态修改线程池参数,我们聊了三十分钟
欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我微信「java_front」一起交流学习0 文章概述流量洪峰是互联网生产环境经常遇到的情况,例如某个时间点进行商品抢购活动,或者某个时间点集中触发定时任务,这些场景都有可能引发流量洪峰,所以如何应对流量洪峰我们必须面对的问题。纵向维度我们可以从代理层、WEB层、服务层、缓存层、数据层进行思考,横向维度我们可以从高频检测、缓存前置、节点冗余、服务降级等方向进行思考。.原创 2021-04-12 12:31:09 · 2887 阅读 · 1 评论 -
长文图解:金字塔原理如何指导技术系统优化
欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,欢迎大家加我微信「java_front」一起交流学习0 文章概述大家想一想工作中有没有遇到以下情况:一位同事用了很长时间罗列了很多事实和数据向你说明一件事情,但是你听完根本不知道他想要说什么。一位同事用了大量笔墨编写了技术方案,不仅有文字还有图表,但是你看完也不知道这个方案到底要解决什么问题以及如何落地。上述情况的出现大概率是因为表述者没有使用结构化方法进行阐释,信息看似非常丰富但.原创 2021-02-26 08:15:34 · 1335 阅读 · 0 评论 -
长文详解:DUBBO源码使用了哪些设计模式
欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,欢迎大家加我微信「java_front」一起交流学习0 文章概述DUBBO作为RPC领域优秀开源的框架在业界十分流行,本文我们阅读其源码并对其使用到的设计模式进行分析。需要说明的是本文所说的设计模式更加广义,不仅包括标准意义上23种设计模式,还有一些代码中常见经过检验的代码模式例如双重检查锁模式、多线程保护性暂停模式等等。1 模板方法模板方法模式定义一个操作中的算法骨架,一.原创 2021-01-02 13:02:43 · 545 阅读 · 1 评论 -
从反脆弱角度谈技术系统的高可用性
欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,欢迎大家加我微信「java_front」一起交流学习1 非线性我们先来介绍一个概念:非线性。这个概念在我们的生活中无处不在。你要赶早上8点钟的火车,如果6:30出发可以在7:00到达车站,于是你得到一个结论:只要30分钟就可以到达车站。你早上想睡晚一点预计7:10出发,想着7:40可以到达车站。但是最可能的结果是你将错过这趟火车。因为正好遇上早高峰,堵车导致你至少需要花费1个小.原创 2020-12-21 12:41:31 · 237 阅读 · 0 评论 -
服务端开发者从零构建系统方法论
欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,欢迎大家加我微信「java_front」一起交流学习1 前言我认为技术之于业务的意义在于:技术可以实现业务的需求,技术可以丰富业务的手段,技术可以扩展业务的边界。从0到1构建一个互联网技术系统是十分具有挑战性的工作,综合能力要求比较高。本文来谈一谈从0到1构建互联网技术系统基本方法论,具体实现细节可能会有所不同。2 关键步骤2.1 技术选型选用稳定的并且经过线上考验的技术和.原创 2020-11-14 12:17:30 · 331 阅读 · 0 评论 -
一种简单可落地的分布式事务实践方案
欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我微信「java_front」一起交流学习1 案例背景用户在电商网站购买了一件衣服,在支付成功后,支付系统需要将订单状态改为支付完成。需要注意支付结果和订单结果需要保持一致,不能出现支付成功后,订单状态却修改失败类似情况,否则用户就会很疑惑:明明支付成功了订单却是待支付状态。对于这种要么同时成功,要么同时失败的场景,最容易想到的是使用事务。我们假设支付表和订单表属于同.原创 2020-11-14 11:45:28 · 462 阅读 · 0 评论 -
多线程设计模式:保护性暂停模式详解以及其在DUBBO应用源码分析
欢迎关注公众号【JAVA前线】查看精彩文章1 文章概述在多线程编程实践中,我们肯定会面临线程间数据交互的问题。在处理这类问题时需要使用一些设计模式,从而保证程序的正确性和健壮性。保护性暂停设计模式就是解决多线程间数据交互问题的一种模式。本文先从基础案例介绍保护性暂停基本概念和实践,再由浅入深,最终分析DUBBO源码中保护性暂停设计模式使用场景。2 什么是保护性暂停我们设想这样一种场景:线程A生产数据,线程B读取数据这个数据。但是有一种情况:线程B准备读取数据时,此时线程A还没有生产出数据。.原创 2020-10-31 20:09:55 · 339 阅读 · 0 评论 -
Java异常分类
1 基本概念java.lang.Throwable是所有异常的根java.lang.Error是错误信息java.lang.Exception是异常信息2 Exception一般分为Checked异常和Runtime异常,所有RuntimeException类及其子类的实例被称为Runtime异常,不属于该范畴的异常则被称为CheckedException。2.1...原创 2012-11-27 15:46:48 · 143960 阅读 · 19 评论 -
面试官:你写的单例模式有空指针异常,请你用Volatile改一下。我愣了五分钟
欢迎关注公众号【JAVA前线】查看精彩文章1 单例模式大家对单例模式并不会陌生,当创建一个对象需要消耗比较多资源时,例如创建数据库连接和消息服务端等等,这时我们选择只创建一份这种类型的对象并在进程内共享。但是单例模式想要写好并不容易,我们写多个版本的单例模式看看每个版本都有什么问题。1.1 版本一这个版本问题非常明显:getConnection方法中多个线程可能同时执行到语句1,而此时myConnection都为空,造成连接对象被多次创建。public class MySimpleConn.原创 2020-10-09 08:37:20 · 932 阅读 · 1 评论 -
为什么阿里不允许用Executors创建线程池
欢迎关注公众号【JAVA前线】查看精彩文章1 文章概述《阿里巴巴JAVA开发手册》有这样一条强制规定:线程池不允许使用Executors去创建,而应该通过ThreadPoolExecutor方式,这样处理方式更加明确线程池运行规则,规避资源耗尽风险。本文我们从资源和排查问题两个角度进行分析,同时参考DUBBO线程池声明方式创建一个符合规范的线程池。2 资源角度《阿里巴巴JAVA开发手册》从资源角度对这个问题进行了分析FixedThreadPool SingleThreadPool允许请求.原创 2020-09-19 12:16:23 · 678 阅读 · 0 评论 -
程序员如何思考复杂问题
欢迎关注公众号【JAVA前线】查看精彩文章1 方法论很重要在日常工作中,大家肯定处理过一些棘手的问题。在面临这些复杂的问题时,尤其当问题又很紧急时,有人完全没有头绪,不知道从哪里下手,而有人思路清晰,分析问题有条有理,行动步骤清晰明确。为什么会产生这样的差距?我认为思路清晰的人掌握了一套方法论,这种方法论可以套用在很多场景,让他们在遇到问题时不慌不忙,最终找到问题的答案。程序员在工作中就需要面对很多复杂问题。比如当系统出现问题时,由于系统的复杂性,很难一眼看出问题所在,那么更需要学会解决问题的方.原创 2020-09-19 11:50:11 · 530 阅读 · 0 评论 -
复杂是技术系统根本属性:为什么代码会变得难以维护
欢迎关注公众号【IT徐胖子】获取更多互联网和技术干货,感谢各位支持1 遗留代码程序员应该都有这样的经历,当接手一份遗留代码时会为此感到苦恼。不仅代码复杂和嵌套结构令人迷惑,而且没有文档和架构图更让人无从维护。当代码维护性几乎为零时,能采用的技术方案只有重构,说白了就是重写。这种情况到底是必然发生,还是仅仅是因为代码不规范导致的?我们先不着急给出答案,这里为大家介绍一本书:《为什么需要生物学思维》,作者是阿贝斯曼。本文谈谈我对这本书的理解,希望可以回答刚才提出的问题。2 复杂系统形成..原创 2020-07-28 12:21:26 · 777 阅读 · 0 评论 -
先写数据库还是先写缓存
关于维护一份数据是先写数据库,还是先写缓存的问题,很多朋友发表了自己的看法,本文来谈谈我的看法。我的结论非常清晰明确:先写数据库再写缓存。核心思想是数据库和缓存之间追求最终一致性,不追求强一致性。(1) 在缓存作为提升系统性能手段的背景下,不需要保证数据库和缓存的强一致性。如果非要保证二者的强一致性,会增大系统的复杂度,完全没有必要(2) 如果更新数据库成功,再更新缓存。此时存在两种情况:更新...原创 2020-02-05 08:49:23 · 2930 阅读 · 0 评论