- 浏览: 7980792 次
- 性别:
- 来自: 广州
-
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
https://yq.aliyun.com/articles/6038?spm=5176.100239.yqblog1.60.lLZ4Gx
前言
本来打算叫做面向异常的编程的,后来觉得可能多的是系统健壮性方面,于是改名面向鲁棒的系统设计,所谓鲁棒,鲁棒是Robust的音译,也就是健壮和强壮的意思。它是在异常和危险情况下系统生存的关键。
平时在做业务系统的时候,尤其是最近一年多接触的超复杂系统,发现处理线上问题所占的时间越来越多,总结发现,其实这些问题大都是之前欠下的债,至于为啥欠债,大多数情况下迫于项目或者日常的时间压力,很多设计从简,业务流程考虑主流程和分支流程,异常流程关注的少,不管三七二十一,功能先上线再说,如此便导致了恶性循环。
由此,我们可以有的应对方案是啥呢,后面的项目,肯定也会是时间压力大的,那只能提升我们自身处理异常的能力了,也就是说在系统设计或者方案考虑的时候,就规避掉,提升应对经验,这样在同样的时间里面,就能够游刃有余,编写出更高质量的代码,进入良性循环阶段。
解决方案探索
大多数的新手程序员,由于编码经验的缺失,导致在代码的保护方面做的不好,随着后续编码经验的积累以及采坑次数的增加,慢慢的会更多关注在健壮性方面;
分享部分典型的案例,抽象一下,学习别人失败的教训,举一反三,来规避问题;
抽象的解决方案描述
远程资源的调用,务必考虑失败或者超时的逻辑;
业务逻辑的测试,多多模拟异常的边界情况;
数据获取类的接口,需要评估目前的数据量,后续的增长情况,以及极端情况下的量大小;
列表类的接口或者数据展示,需要考虑数据的极限情况,最大是多少,并做好保护;
批量的数据,务必需要考虑异常情况,部分失败了怎么办;
典型案例
本地缓存,加载失败,之后应用系统启动
java local cache在高并发系统中,使用的较多,把热点的数据或者元数据存储在JVM的heap区,从而实现低延迟,但是这里就涉及到缓存数据的加载了;
常用的数据加载方案,一种是应用启动的时候,全部加载所有的数据,之后有增量变更的时候,再增量更新;另外一种是启动的时候不加载,在数据第一次访问的时候加载这个数据;
这两种方式各有优劣,但是假如选择了第一种,就需要在逻辑里面考虑,假如缓存数据加载失败了,怎么办,是应用系统直接启动失败,还是代码逻辑里面冗余懒加载的机制,如果不考虑,又一个坑留下了;
分布式缓存和数据库中的数据一致性考虑
目前互联网级的系统,缓存基本上是架构上不可或缺的,引入缓存,必然就会面临数据一致性问题,举个例子,加入同一份数据,在DB和缓存中都有,这时候用户在页面操作,变更数据,需要变更缓存和DB,需要同时生效,如果update 的sql执行成功,之后缓存变更的时候超时了导致变更失败,这时候,整体应该返回用户失败,然后DB的数据回滚掉。
如果是没有经验的开发,可能就DB更新,然后缓存更新,没有针对缓存更新失败或者超时做逻辑处理,本地值系统功能逻辑缺失导致;
业务操作和数据库持久化以及消息发送的一致性考虑
业务系统,在考虑异步解耦的时候,会引入消息系统,这时候面临了一个问题,就是业务操作和消息系统的一致性问题;
业务操作和消息的发送,要能够满足事务的特性,例如借助二阶段提交来实现,然后消息系统来进行重试,从而实现最终一致性的要求;
批量更新数据库的顺序问题导致的死锁
假如这里有个方法,是List数据的更新,在并发情况下,如果更新的SQL不做排序,会导致死锁问题,这时候需要按照唯一主键,例如id来做排序,从而保证锁占用的时候的顺序性;
至于为啥会有死锁问题,假如两个调用,含有相同的数据,例如都含有A和B,因为批量update占锁的时候,是行级占用,第一个线程是A-B顺序,第二个线程是B-A顺序,第一个线程占了A,第二个线程占了B,然后,然后就死锁了;
页面点击操作,可能涉及到非常复杂的业务逻辑,是否考虑异步化,引入排队机制
举个例子,点击一个确认按钮,背后很多业务逻辑,这时候需要用户等待的时间比较长;
如果存在少量数据和大量数据共同存在,切大数据量是常态的情况下,可以考虑异步化操作;
用户点击之后,存储任务在进行中的状态,然后后台多线程处理,处理完了之后,回写状态,页面刷新后看到最新的结果,如果不需要用户刷新就能看到结果,可以在页面做长连接或者ajax轮训;
更新数据,例如更新十条,第六条出错了,是回滚还是继续处理
批量操作,正常流程没有问题,一下子全部成功,但是假如其中的一条出现错误;
两种方案,一种是所有的数据都回滚,然后提示用户修改数据,重新提交,另外一种就是成功的提交,失败的记录下来,让用户重试失败的数据,但是失败的逻辑一定要有;
页面数据加载多个区块的数据,且部分区块获取数据的接口高延迟
同步加载的时候,整个页面加载的速度会慢很多,所以在做数据加载设计的时候,就要区分掉;
区块可以修改为异步ajax来进行加载数据;
数据导出功能,如果是非常少的数据导出,则直接导出即可,但是数据量大,就会面临各种问题
数据读取的时候,如果多于特定的量,是否可以分页或者多线程加载;
导出数据的上限限制,如果没有上限,可能出现几百万的数据,用户点击导致,由于http请求的超时机制,用户可能会重复点击,此时服务器和数据库的压力会很大;
数据回写,除了直接返回之外,是否可以写文件,然后直接提供给用户需要下载的文件链接;
平时遇到的问题大多数是,系统刚刚上线,业务数据比较少,功能能够正常,但是随着业务发展,数据越来越多,导致的问题就是无法下载下来,而如果没有做上面的优化或者保护的话,这个功能使用就会出现异常;
前言
本来打算叫做面向异常的编程的,后来觉得可能多的是系统健壮性方面,于是改名面向鲁棒的系统设计,所谓鲁棒,鲁棒是Robust的音译,也就是健壮和强壮的意思。它是在异常和危险情况下系统生存的关键。
平时在做业务系统的时候,尤其是最近一年多接触的超复杂系统,发现处理线上问题所占的时间越来越多,总结发现,其实这些问题大都是之前欠下的债,至于为啥欠债,大多数情况下迫于项目或者日常的时间压力,很多设计从简,业务流程考虑主流程和分支流程,异常流程关注的少,不管三七二十一,功能先上线再说,如此便导致了恶性循环。
由此,我们可以有的应对方案是啥呢,后面的项目,肯定也会是时间压力大的,那只能提升我们自身处理异常的能力了,也就是说在系统设计或者方案考虑的时候,就规避掉,提升应对经验,这样在同样的时间里面,就能够游刃有余,编写出更高质量的代码,进入良性循环阶段。
解决方案探索
大多数的新手程序员,由于编码经验的缺失,导致在代码的保护方面做的不好,随着后续编码经验的积累以及采坑次数的增加,慢慢的会更多关注在健壮性方面;
分享部分典型的案例,抽象一下,学习别人失败的教训,举一反三,来规避问题;
抽象的解决方案描述
远程资源的调用,务必考虑失败或者超时的逻辑;
业务逻辑的测试,多多模拟异常的边界情况;
数据获取类的接口,需要评估目前的数据量,后续的增长情况,以及极端情况下的量大小;
列表类的接口或者数据展示,需要考虑数据的极限情况,最大是多少,并做好保护;
批量的数据,务必需要考虑异常情况,部分失败了怎么办;
典型案例
本地缓存,加载失败,之后应用系统启动
java local cache在高并发系统中,使用的较多,把热点的数据或者元数据存储在JVM的heap区,从而实现低延迟,但是这里就涉及到缓存数据的加载了;
常用的数据加载方案,一种是应用启动的时候,全部加载所有的数据,之后有增量变更的时候,再增量更新;另外一种是启动的时候不加载,在数据第一次访问的时候加载这个数据;
这两种方式各有优劣,但是假如选择了第一种,就需要在逻辑里面考虑,假如缓存数据加载失败了,怎么办,是应用系统直接启动失败,还是代码逻辑里面冗余懒加载的机制,如果不考虑,又一个坑留下了;
分布式缓存和数据库中的数据一致性考虑
目前互联网级的系统,缓存基本上是架构上不可或缺的,引入缓存,必然就会面临数据一致性问题,举个例子,加入同一份数据,在DB和缓存中都有,这时候用户在页面操作,变更数据,需要变更缓存和DB,需要同时生效,如果update 的sql执行成功,之后缓存变更的时候超时了导致变更失败,这时候,整体应该返回用户失败,然后DB的数据回滚掉。
如果是没有经验的开发,可能就DB更新,然后缓存更新,没有针对缓存更新失败或者超时做逻辑处理,本地值系统功能逻辑缺失导致;
业务操作和数据库持久化以及消息发送的一致性考虑
业务系统,在考虑异步解耦的时候,会引入消息系统,这时候面临了一个问题,就是业务操作和消息系统的一致性问题;
业务操作和消息的发送,要能够满足事务的特性,例如借助二阶段提交来实现,然后消息系统来进行重试,从而实现最终一致性的要求;
批量更新数据库的顺序问题导致的死锁
假如这里有个方法,是List数据的更新,在并发情况下,如果更新的SQL不做排序,会导致死锁问题,这时候需要按照唯一主键,例如id来做排序,从而保证锁占用的时候的顺序性;
至于为啥会有死锁问题,假如两个调用,含有相同的数据,例如都含有A和B,因为批量update占锁的时候,是行级占用,第一个线程是A-B顺序,第二个线程是B-A顺序,第一个线程占了A,第二个线程占了B,然后,然后就死锁了;
页面点击操作,可能涉及到非常复杂的业务逻辑,是否考虑异步化,引入排队机制
举个例子,点击一个确认按钮,背后很多业务逻辑,这时候需要用户等待的时间比较长;
如果存在少量数据和大量数据共同存在,切大数据量是常态的情况下,可以考虑异步化操作;
用户点击之后,存储任务在进行中的状态,然后后台多线程处理,处理完了之后,回写状态,页面刷新后看到最新的结果,如果不需要用户刷新就能看到结果,可以在页面做长连接或者ajax轮训;
更新数据,例如更新十条,第六条出错了,是回滚还是继续处理
批量操作,正常流程没有问题,一下子全部成功,但是假如其中的一条出现错误;
两种方案,一种是所有的数据都回滚,然后提示用户修改数据,重新提交,另外一种就是成功的提交,失败的记录下来,让用户重试失败的数据,但是失败的逻辑一定要有;
页面数据加载多个区块的数据,且部分区块获取数据的接口高延迟
同步加载的时候,整个页面加载的速度会慢很多,所以在做数据加载设计的时候,就要区分掉;
区块可以修改为异步ajax来进行加载数据;
数据导出功能,如果是非常少的数据导出,则直接导出即可,但是数据量大,就会面临各种问题
数据读取的时候,如果多于特定的量,是否可以分页或者多线程加载;
导出数据的上限限制,如果没有上限,可能出现几百万的数据,用户点击导致,由于http请求的超时机制,用户可能会重复点击,此时服务器和数据库的压力会很大;
数据回写,除了直接返回之外,是否可以写文件,然后直接提供给用户需要下载的文件链接;
平时遇到的问题大多数是,系统刚刚上线,业务数据比较少,功能能够正常,但是随着业务发展,数据越来越多,导致的问题就是无法下载下来,而如果没有做上面的优化或者保护的话,这个功能使用就会出现异常;
发表评论
-
复习:强迫线程顺序执行方式
2019-01-03 23:42 1633方法1: 三个线程,t1,t2,t3,如果一定要按顺序执行, ... -
(转)不错的前后端处理异常的方法
2019-01-02 23:16 2039前言 在 Web 开发中, 我们经常会需要处理各种异常, 这是 ... -
info q的极客时间大咖说等资料下载
2018-08-15 08:40 3502info q的极客时间大咖说等资料下载,还有不少思维导图 链 ... -
CXF 客户端超时时间设置(非Spring配置方式)
2018-07-03 22:38 2259import org.apache.cxf.endpoint. ... -
(转)synchronized关键字画像:正确打开方式
2018-06-14 09:25 512https://mp.weixin.qq.com/s/b3Sx ... -
CountDownLatch的例子
2018-06-13 14:10 713public class StatsDemo { ... -
两道面试题,带你解析Java类加载机制
2018-06-12 16:29 638https://mp.weixin.qq.com/s/YTa0 ... -
Spring中获取request的几种方法,及其线程安全性分析
2018-06-11 09:03 692https://mp.weixin.qq.com/s/KeFJ ... -
内部类小结
2018-06-06 10:25 456https://mp.weixin.qq.com/s/hErv ... -
JVM虚拟机小结1
2018-06-04 20:43 5811 jps -l //列出详细的类名和进程ID 2)jps ... -
windows下自带命令行工具查看CPU资源情况等
2018-06-04 12:53 3130微软提供了不少命令行� ... -
(收藏)深入分析Java的序列化与反序列化
2018-05-30 15:21 637https://mp.weixin.qq.com/s/T2Bn ... -
apache common包中的序列化工具
2018-05-30 09:10 1860什么是序列化 我们的� ... -
JAVA8 JVM的变化: 元空间(Metaspace)
2018-05-24 22:30 986本文将会分享至今为至我收集的关于永久代(Permanent G ... -
(转)服务器性能指标(一)——负载(Load)分析及问题排查
2018-05-21 21:03 1403原创: Hollis Hollis 负载 ... -
(转)对象复用
2018-05-20 15:27 885public class Student { priv ... -
mapreduce中入门中要注意的几点
2018-05-06 08:59 696在 mapreduce中,比如有如下的词: I love b ... -
HDFS的基本操作
2018-05-02 21:47 959-mkdir 在HDFS创建目录 ... -
一个不错的开源工具类,专门用来解析日志头部的,好用
2018-05-02 20:00 789一个不错的开源工具类,专门用来解析日志头部的,好用。 http ... -
介绍个不错的RESTFUL MOCK的工具wiremock
2018-04-27 21:02 1924介绍个不错的RESTFUL MOCK的工具wiremock,地 ...
相关推荐
面向鲁棒运动控制系统的分数阶PID控制器设计自整定与实验研究 本论文主要研究了鲁棒运动控制系统中的分数阶PID控制器设计、自整定和实验研究。论文首先介绍了分数阶微积分理论的发展和应用前景,强调了分数阶微积分...
2. **初步设计**:将鲁棒分析的概念融入系统设计,确保架构的稳健性。 3. **绘制鲁棒分析图**:使用纸和笔作为首选工具,绘制对象间的逻辑流,避免陷入过于细节的设计判断。 4. **迭代优化**:根据鲁棒分析的结果,...
总的来说,面向自然语言处理的对抗攻防与鲁棒性分析是一个活跃的研究领域,它对于保障AI系统的安全性、稳定性和可靠性具有重要意义。未来的研究需要继续探索新的攻击手段,同时研发更有效的防御策略,以应对不断进化...
2. **鲁棒状态反馈控制**:通过设计状态反馈控制器,使闭环系统的性能在所有可能的不确定参数下都满足预设的性能指标,确保系统稳定。 3. **鲁棒优化控制**:在考虑不确定性的条件下,寻找最优控制策略,以实现最佳...
鲁棒分析(Robustness Analysis)是系统设计中的一种重要方法,旨在确保软件系统在面临各种异常情况时仍能保持稳定和可靠。以下是关于B2C电子商城鲁棒分析的详细探讨。 1. **鲁棒性概念**:鲁棒性是指系统在面对不...
综上所述,面向新能源并网的电力系统鲁棒调度模式通过其在多时间尺度的综合考虑和对不确定性的包容性设计,显著提升了电力系统的抗风险能力和调度效率。这种调度模式对于应对新能源并网带来的挑战,保障电力系统的...
面向窃听用户的RIS-MISO系统鲁棒资源分配算法 面向窃听用户的RIS-MISO系统鲁棒资源分配算法是指在无线通信系统中,使用重新配置智能表面(Reconfigurable Intelligent Surfaces, RIS)来实现鲁棒资源分配,以提高...
在数据库持久层设计中,鲁棒性意味着系统能够承受各种异常情况,如数据不一致、网络中断或并发访问等,并能正确处理这些问题,保证数据的完整性和一致性。实现这一目标通常需要采用事务管理、错误处理和重试机制等...
"DTCD_鲁棒悬架_suspension_轿车_悬架_主动悬架"这一标题揭示了我们讨论的主题是关于一种针对轿车设计的主动悬架系统,它采用了鲁棒控制技术来提升整体性能。 主动悬架系统与传统的被动悬架不同,它能够实时调整...
面向节能环保的PLC控制系统设计是一项针对工业自动化控制领域的重要课题。PLC(Programmable Logic Controller,可编程逻辑控制器)作为现代工业自动化的核心设备,通过灵活的编程和配置,提供了工业自动化系统中的...
涉及系统建模、不确定性分析、鲁棒控制器(如H∞、滑模、自适应控制)设计、仿真实验及硬件实验,最后提供了完整的Matlab源码与运行指南,并展示了开环和闭环系统的响应对比结果,证明所设计的鲁棒控制器的有效性。...
### 面向工业对象的基于粒子群算法的闭环辨识及鲁棒IMC-PID设计 #### 1. 引言 随着工业自动化水平的提高,控制系统面临着日益复杂的挑战。传统的控制器参数整定方法往往依赖于人工经验,不仅耗时耗力,而且难以...
1. 逻辑控制模块:它对智能家居系统中的业务请求进行智能处理,这是系统设计中的核心部分。逻辑控制模块是智能家居系统的大脑,它负责分析和响应用户的操作指令。 2. 用户访问模块:这一模块为用户提供底层实现的...
Salgado三位作者合著,是一本全面深入探讨控制理论与实践的教材,特别适合对控制系统设计有浓厚兴趣的学习者和工程师。本书不仅涵盖了基本的控制原理,还涉及了高级的控制策略和技术,旨在帮助读者理解和掌握控制...
面向对象的程序设计语言C++是一种强大的、灵活的编程工具,它在软件开发领域占据了重要的地位。C++是由Bjarne Stroustrup于1983年基于C语言发展而来的,旨在提供一种支持面向对象编程(OOP)概念的语言环境。 **...
标题和描述中提到的“音视频-编解码-面向互联网敏感内容的图像检索系统设计与实现”是一个针对网络上敏感内容的图像检索系统的研究。该系统旨在通过高效的编解码技术,对互联网上的图像进行识别和检索,以实现对敏感...
面向对象设计思想是软件设计的基础,类图是面向对象程序设计的基本单元,描述软件系统的静态结构。 类图的组成部分: * 类:是面向对象技术的基础,是面向对象程序设计的基本单元。类可以进一步划分为实体类、边界...
系统设计方面,电力巡检机器人的SLAM系统可能包括数据采集模块(2D Lidar)、预处理模块(去除噪声、滤波)、特征提取和匹配模块、定位模块(融合多种传感器数据,如IMU、GPS等)以及地图更新和优化模块。...