- 浏览: 7856007 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (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 1482方法1: 三个线程,t1,t2,t3,如果一定要按顺序执行, ... -
(转)不错的前后端处理异常的方法
2019-01-02 23:16 1967前言 在 Web 开发中, 我们经常会需要处理各种异常, 这是 ... -
info q的极客时间大咖说等资料下载
2018-08-15 08:40 3416info q的极客时间大咖说等资料下载,还有不少思维导图 链 ... -
CXF 客户端超时时间设置(非Spring配置方式)
2018-07-03 22:38 2186import org.apache.cxf.endpoint. ... -
(转)synchronized关键字画像:正确打开方式
2018-06-14 09:25 449https://mp.weixin.qq.com/s/b3Sx ... -
CountDownLatch的例子
2018-06-13 14:10 632public class StatsDemo { ... -
两道面试题,带你解析Java类加载机制
2018-06-12 16:29 555https://mp.weixin.qq.com/s/YTa0 ... -
Spring中获取request的几种方法,及其线程安全性分析
2018-06-11 09:03 625https://mp.weixin.qq.com/s/KeFJ ... -
内部类小结
2018-06-06 10:25 399https://mp.weixin.qq.com/s/hErv ... -
JVM虚拟机小结1
2018-06-04 20:43 4651 jps -l //列出详细的类名和进程ID 2)jps ... -
windows下自带命令行工具查看CPU资源情况等
2018-06-04 12:53 3043微软提供了不少命令行 ... -
(收藏)深入分析Java的序列化与反序列化
2018-05-30 15:21 557https://mp.weixin.qq.com/s/T2Bn ... -
apache common包中的序列化工具
2018-05-30 09:10 1778什么是序列化 我们的 ... -
JAVA8 JVM的变化: 元空间(Metaspace)
2018-05-24 22:30 913本文将会分享至今为至我收集的关于永久代(Permanent G ... -
(转)服务器性能指标(一)——负载(Load)分析及问题排查
2018-05-21 21:03 1266原创: Hollis Hollis 负载 ... -
(转)对象复用
2018-05-20 15:27 808public class Student { priv ... -
mapreduce中入门中要注意的几点
2018-05-06 08:59 621在 mapreduce中,比如有如下的词: I love b ... -
HDFS的基本操作
2018-05-02 21:47 883-mkdir 在HDFS创建目录 ... -
一个不错的开源工具类,专门用来解析日志头部的,好用
2018-05-02 20:00 710一个不错的开源工具类,专门用来解析日志头部的,好用。 http ... -
介绍个不错的RESTFUL MOCK的工具wiremock
2018-04-27 21:02 1855介绍个不错的RESTFUL MOCK的工具wiremock,地 ...
相关推荐
面向鲁棒运动控制系统的分数阶PID控制器设计自整定与实验研究博士学位论文.doc
粒子群算法操作简便、容易实现且全局搜索功能较强,在优化问题中表现出良好的性能。...采用鲁棒IMC-PID控制策略对辨识出的对象设计控制器,控制效果良好,收敛速度快,具有良好的抗干扰性和鲁棒性。
针对已有方法模型依赖性强、鲁棒性差的局限性,提出了一种面向重心变化的非线性自适应飞行控制系统设计方法。该方法基于逆动力学理论和重心在线估计系统设计标称控制律,在此基础上引入自适应滑模控制单元来构建...
面向空间定位系统的分布式融合估计.pdf,针对网络化高精度测量定位中的测量规模大、通信约束复杂以及处理信号协同困难等问题,基于线性CCD的空间定位原理,研究带有交叉相关噪声和传输时滞的不确定网络化系统的信息...
系统设计:阐述了如何根据实际应用场景和需求,设计一个适用于物联网环境的机器视觉目标跟踪系统,包括硬件选择、软件架构、数据处理流程等方面的内容。实现步骤:提供了详细的目标跟踪方法实现步骤,包括数据预处理...
为此,提出了一种面向中低压配电网的VSG多机协同鲁棒运行控制方法,主要针对协同运行控制中的母线电压跟踪、多机功率均分以及中低压配电网中线路阻抗参数不确定造成的功率耦合不确定和系统设备出力不确定等问题进行...
串联式混合动力汽车柴油机辅助功率单元(APU)是一个多输入多输出的复杂非线性系统,为便于控制器的设计,提出一种简单的面向控制的APU模型鲁棒辨识方法。该方法基于非线性变增益控制的原理,把APU系统看成一个线性变...
着重讨论了面向家纺企业的iS-ERP系统中的车间管理子系统,目的是帮助家纺企业解决车间的管理和调度问题.从系统业务流程、功能两个方面重点介绍了它的设计方案,并也详细介绍了以模板开发它的实现方法技术.结果证明此子...
为了简化,建立了具有变形跨度机翼的面向控制模型。由于跨度变形引起的气动特性变化较大,要求具有较强的鲁棒性和自适应能力。为了保证系统的收敛性,基于定时控制技术开发了多变量滑模流形。为了节省飞行控制系统的...
新的鲁棒推理控制系统设计方法.pdf 无换向器电动机在窑尾排风上的应用.pdf 最优加权系数的神经优化方法.pdf 格子机数据挖掘方法.caj 模糊控制在现场总线控制系统中的应用.pdf 模糊控制系统近年来的研究与发展.pdf ...
新的鲁棒推理控制系统设计方法.pdf 一类递归RBF神经网络模型的稳定性讨论.pdf 一种估计人工神经网络泛化误差的新方法.pdf 一种基于遗传算法的模糊神经网络最优控制.pdf 一种建立模糊模型的粗糙集方法.pdf 一种自适应...
新的鲁棒推理控制系统设计方法.pdf 无换向器电动机在窑尾排风上的应用.pdf 最优加权系数的神经优化方法.pdf 格子机数据挖掘方法.caj 模糊控制在现场总线控制系统中的应用.pdf 模糊控制系统近年来的研究与发展.pdf ...
新的鲁棒推理控制系统设计方法.pdf 无换向器电动机在窑尾排风上的应用.pdf 最优加权系数的神经优化方法.pdf 格子机数据挖掘方法.caj 模糊控制在现场总线控制系统中的应用.pdf 模糊控制系统近年来的研究与发展.pdf ...
Java语言是一种面向对象的编程语言,它的特点是简单、面向对象、分布式、解释型、鲁棒性、安全性、平台无关性和可移植性。这些特性使得Java在企业级应用和互联网应用中得到了广泛的应用。 Java的应用领域 Java的应用...
2. **编程环境**:提供了易于使用的脚本编写与函数定义界面,支持面向对象编程,并可通过M文件实现模块化程序设计。 3. **数据可视化**:内置强大的二维和三维图形绘制功能,能够创建高质量的数据图表,便于数据...
针对大规模电力系统实时性电压扰动识别的需求,文中研究了面向数据监测的动态电压扰动识别技术。通过设计电压扰动识别系统模型,实现了电压数据采集与扰动识别系统的一体化设计。另外,经过数据监测算法模型的构建,...
根据闭环系统补灵敏度函数的最大值,从频域角度设计了滤波时间常数,以保证系统具有一定的鲁棒性。在此基础上,根据等效的反馈结构,将内模控制方法引入PID控制器的设计,得到了PID参数的明确解析结果。系统的动态性能和...
提出 “航行脑 ” 系统的概念设计.该系统是服务于船舶智能航行的人工智能系统,由感知、认知和决策执行 等 3 个功能空间组成. “感知空间 ”获取船舶在航环境和自身状态信息;“认 知空间 ”根 据 感知的信息抽 象 出 ...
1.8.3 面向对象思想在C#程序设计中的重要性 1.9 GUI编程 1.10 本章小结 第2章 线性方程组迭代解法 第3章 线性方程组的直接解法 第4章 正交变换与最小二乘计算方法 第5章 鲁棒估计 第6章 随机数 第7章...
摘要:针对测控系统中测试仪器接口的差异性,利用面向对象的程序设计的封装,继承和多态思想,设计了一个具有较强通用性的通讯类。在此给出了该类族的UML图例,在具体的设计应用中,各个层次的分工明确清晰,从而...