软件设计中的幂等性哲学
幂等性有个前提就是它不以时间为转移的,比方说你不可能要求腾讯网新闻首页每次打开都是一样的。当然这里面有个对幂等性级别和层次上的要求,如果你只要求数据格式上的完整性、一致性,你甚至可以认为一个股票行情查询接口也具有幂等性。(股票行情查询接口需要情况下也可以被设计为具有幂等性)
幂等性通常在分布式软件系统设计中被提到。这主要是由于请求方和响应方的协议来完成的,这个对协议的设计要求其实是比较高的。好的协议设计不仅要可可靠地完成应有功能,还要保证契约双方在所有情况下对数据理解上的一致性。这个所有情况就很复杂了,比较典型的是请求失败下的重试情况。这个是事务设计中的需要重点考虑的。银行的ATM通信线路不见得完全可靠,但你必须保证在重新请求主机时客户的帐户不会有重复的扣减。
幂等性在REST的设计思想中也有充分的体现。因为WEB系统本身就是一个分布式系统。REST没有细致的规范,所以很多时间做这件事情的时候是上升到哲学和艺术的层次的。一个好的设计不仅在GET上有一致性,在做POST的应该同样具有一致性。如果你有遇到过客户在浏览器端因为前端页面失败的情况下,重复提交导致系统中创建了重复的记录,你就应该去思考了幂等性的问题了。简单的做法可以仿照事务的做法给“每一份”表单一个标识。
另外,无状态系统的设计避免了分布数据在时间转移后的不一致问题,可以让你的系统更具有更高的幂等性,从而不会因为重启服务器而丢失数据或者导致数据的不一致性。幂等性是以时间转移后的等效性为假设前提的,如果你在设计过程中去贯穿这个哲学,经常假设契约各方是“不可靠”的,反之你的软件系统在质量上就可以上升一个级别。