Sun Microsystems公司的研究员Peter Deutsch早在1994年就意识到了几个有关分布式系统的误区:
网络是可靠的
为了建立一个可靠的系统,我们必须理解并接受这样一个事实:任何特定的通信都可能失败;因此,我们需要为系统提供一种方法来处理这种潜在的错误。
一次 rpc 请求对客户端来说可能会出现三种结果返回:成功、失败、未知。未知比较常见的就是网络超时返回异常,当发生网络超时时,服务端可能成功,也可能失败,也可能正在处理中。对于客户端来说只能通过查询、重试、甚至分布式事务、事务消息来处理。不过,当服务端可能正在处理中时,查询可能查不到结果状态,这个需要根据业务特殊处理此场景。
延迟是不存在的
延迟是无所不在的。它发生在所有的通信中。
理想情况下,这种开销应该尽可能的小。延迟对用户体验和性能有很大影响,所以你应该注意以下事项:
· 避免频繁的网络调用和一些不必要的请求。
典型的技术实现有:连接池池化技术、批量请求。
· 考虑采用缓存、内容分发网络(CDN)、多区域部署等技术或方法来使得数据离客户端更近。
· 采用“发布/订阅”模式,以通知有新数据到达,并将其存储在本地以便可以立即使用这些数据。
带宽是无限的
现如今,网络带宽似乎不再是一个大问题了。但事实上,新的技术和边缘计算等新领域会开辟一些需要更高带宽的新场景。举个例子:据测算,一辆无人驾驶汽车每天大约会产生50TB的数据。这样的数据量就需要你在设计应用时考虑到带宽使用情况。
传输是没有成本的
首先,数据通过网络传输,而网络流量在大多数的公有云平台上都是要收费的。大多数云服务商对入网流量不收费,但是对出网流量会收费。
其次,传输的数据与对象之间的转换是有成本的,例如序列化和反序列化除了会带来网络延迟外通常还会产生一些额外的昂贵开销。
网络是安全的
假设你可以信任你所在的网络或你为之建立系统的人,可能是一个至关重要的错误。
如今,随着众包漏洞赏金计划的出现和每天新闻中重大漏洞的出现,这一点变得更加明显。
在设计你的系统时采取安全第一的立场将在未来获得回报。即使花时间评估你当前系统的安全漏洞也是一个很好的开始,并将很快产生一个简短的改进清单。
网络通信都是一样的
这个误区现在几乎不值一提了,因为几乎每个开发人员和架构师都知道在构建应用程序的时候必须考虑到不同的网络协议。
「Fallacies of Distributed Systems (分布式系统的谬误)」是 L Peter Deutsch 等人提出的一些观点,描述了分布式应用程序新手总是做出的错误假设。
architecturenotes.co/fallacies-of-distributed-systems/