欢迎来到现实世界
2015-08-26 21:58
405 查看
作者:格雷戈尔侯珀(Gregor Hohpe)
工程师偏爱精确,整天与1和0打交道的软件工程师更是如此。我们习惯了非即此彼的世界,凡事不是1就是0,不是真就是假,不是是就是否。在外键约束、原子事务和校验和的保证下,一切都是清楚的、确定的。
可惜现在世界不是二进制的。顾客有可能撤消确认过的订单,支票可能跳票,信件可能丢失,付款时间可能延迟,许下承诺还可能失信,数据记录时不时就会出错。用户偏爱提供更多功能的“压缩”(shallow)界,他们讨厌繁琐的、一步接一步的交互步骤。对程序员来说,这种一维的过程看起来更符合逻辑,也更容易实现。可是别忘了,真正决定程序流程的不是调用堆栈(call stack),而是用户需求。
这些己经够糟了,可分布式系统又带来了新的不一致。服务有可能失效,状态可能在毫无征兆的情况下改变,事务处理可能得不到保证。应用程序运行在成千上万机器上,出错是不可避免的,只是迟与早的问题。分布式系统不但是松耦合、异步、并发的,而且不遵守传统的事务语义(transaction semantics),这些都是程序员的噩梦。
计算机科学家设想的完美世界正在崩溃,我们该怎么办?克服所有因难的步骤都一样,首先要接受现实。向令人怀念的调用堆栈架构告别吧,忘掉那些程序员决定程序流程的日子,准备好应付随时出现的乱序事件,不断根据具体情境调整策略。用异步的、并发的请求代替一个接一个的方法调用。设计应用时,借助事件驱动的过程链(event-driven process chain)模型或状态模型控制无序的状况,通过调整、重发,甚至试探的办法纠正错误。
你也许不曾料到事情这么复杂吧。还好,类似的问题也一直在现实生活中上演:信件延迟、承诺后毁约、通信相互干扰、收款账户混淆——这样的例子举不胜举。我们的对策是重发信件、撤销定单、通知付款人钱己到账,不必再理催款单,等等。所以别在抱怨现实世界带来了麻烦,不妨从中寻找解决问题的灵感。比如向星巴克学习,看看他们是怎么改良两阶段提交(two-phase commit)模式的。欢迎来到现实世界。
工程师偏爱精确,整天与1和0打交道的软件工程师更是如此。我们习惯了非即此彼的世界,凡事不是1就是0,不是真就是假,不是是就是否。在外键约束、原子事务和校验和的保证下,一切都是清楚的、确定的。
可惜现在世界不是二进制的。顾客有可能撤消确认过的订单,支票可能跳票,信件可能丢失,付款时间可能延迟,许下承诺还可能失信,数据记录时不时就会出错。用户偏爱提供更多功能的“压缩”(shallow)界,他们讨厌繁琐的、一步接一步的交互步骤。对程序员来说,这种一维的过程看起来更符合逻辑,也更容易实现。可是别忘了,真正决定程序流程的不是调用堆栈(call stack),而是用户需求。
这些己经够糟了,可分布式系统又带来了新的不一致。服务有可能失效,状态可能在毫无征兆的情况下改变,事务处理可能得不到保证。应用程序运行在成千上万机器上,出错是不可避免的,只是迟与早的问题。分布式系统不但是松耦合、异步、并发的,而且不遵守传统的事务语义(transaction semantics),这些都是程序员的噩梦。
计算机科学家设想的完美世界正在崩溃,我们该怎么办?克服所有因难的步骤都一样,首先要接受现实。向令人怀念的调用堆栈架构告别吧,忘掉那些程序员决定程序流程的日子,准备好应付随时出现的乱序事件,不断根据具体情境调整策略。用异步的、并发的请求代替一个接一个的方法调用。设计应用时,借助事件驱动的过程链(event-driven process chain)模型或状态模型控制无序的状况,通过调整、重发,甚至试探的办法纠正错误。
你也许不曾料到事情这么复杂吧。还好,类似的问题也一直在现实生活中上演:信件延迟、承诺后毁约、通信相互干扰、收款账户混淆——这样的例子举不胜举。我们的对策是重发信件、撤销定单、通知付款人钱己到账,不必再理催款单,等等。所以别在抱怨现实世界带来了麻烦,不妨从中寻找解决问题的灵感。比如向星巴克学习,看看他们是怎么改良两阶段提交(two-phase commit)模式的。欢迎来到现实世界。
相关文章推荐
- How many integers can you find(容斥+dfs)
- leetCode 28 Implement strStr()
- Servlet技术中的对象--Request与Response
- android绝对布局
- HDOJ 5343 MZL's Circle Zhou 后缀自动机
- listary文件管理小工具,提升工作效率
- 如何算音频PTS
- Manacher算法----最长回文子串
- magento直接操作数据库
- 简述const修饰符在C++和C语言编译器中的区别
- 事件驱动仿真
- [转载]泛化、实现、依赖和关联的区别
- Spring与Mybatis整合的MapperScannerConfigurer处理过程源码分析
- 多进程、多线程
- UI_1
- java ConcurrentHashMap
- 关于Android布局中键盘遮挡问题
- matlab首次启动时报runtime error错误
- POJ 1321 棋盘问题(搜索)
- jquery学习