欢迎来到现实世界

来源:互联网 发布:成年弱视知乎 编辑:程序博客网 时间:2024/04/30 15:04

作者:格雷戈尔侯珀(Gregor Hohpe)

工程师偏爱精确,整天与1和0打交道的软件工程师更是如此。我们习惯了非即此彼的世界,凡事不是1就是0,不是真就是假,不是是就是否。在外键约束、原子事务和校验和的保证下,一切都是清楚的、确定的。

可惜现在世界不是二进制的。顾客有可能撤消确认过的订单,支票可能跳票,信件可能丢失,付款时间可能延迟,许下承诺还可能失信,数据记录时不时就会出错。用户偏爱提供更多功能的“压缩”(shallow)界,他们讨厌繁琐的、一步接一步的交互步骤。对程序员来说,这种一维的过程看起来更符合逻辑,也更容易实现。可是别忘了,真正决定程序流程的不是调用堆栈(call stack),而是用户需求。

这些己经够糟了,可分布式系统又带来了新的不一致。服务有可能失效,状态可能在毫无征兆的情况下改变,事务处理可能得不到保证。应用程序运行在成千上万机器上,出错是不可避免的,只是迟与早的问题。分布式系统不但是松耦合、异步、并发的,而且不遵守传统的事务语义(transaction semantics),这些都是程序员的噩梦。

计算机科学家设想的完美世界正在崩溃,我们该怎么办?克服所有因难的步骤都一样,首先要接受现实。向令人怀念的调用堆栈架构告别吧,忘掉那些程序员决定程序流程的日子,准备好应付随时出现的乱序事件,不断根据具体情境调整策略。用异步的、并发的请求代替一个接一个的方法调用。设计应用时,借助事件驱动的过程链(event-driven process chain)模型或状态模型控制无序的状况,通过调整、重发,甚至试探的办法纠正错误。

你也许不曾料到事情这么复杂吧。还好,类似的问题也一直在现实生活中上演:信件延迟、承诺后毁约、通信相互干扰、收款账户混淆——这样的例子举不胜举。我们的对策是重发信件、撤销定单、通知付款人钱己到账,不必再理催款单,等等。所以别在抱怨现实世界带来了麻烦,不妨从中寻找解决问题的灵感。比如向星巴克学习,看看他们是怎么改良两阶段提交(two-phase commit)模式的。欢迎来到现实世界。

0 0
原创粉丝点击