通过“分布式系统的8大谬误”反思APP的设计

作为移动端和网站开发者,有大量现成的网络开发代码可以使用在开发中直接使用。可惜的是没有一套代码可以代替我们全面考虑到网络的不可靠性,尤其是在移动端设备上。同时,幸运的是有些著名的结论以及一些著名的模式可以帮助我们思考如何优雅的处理现实世界中的现实问题。接下来让我们一起思考著名的“分布式系统的8大谬误”,以及我们该如何避免这些问题。

以下是著名的“分布式系统的8大谬误”

1, 网络是可靠的;

2, 网络不存在时延;

3, 网络带宽是无限的;

4, 网络是安全的;

5, 网络拓扑结构是不会变化的;

6, 只有一个管理员;

7, 网络传输是不需要任何代价;

8, 网络是同构的。

谬误1:网络是可靠的;

然而事实是:

1, 你的网络忽然在某个时间段无法工作了;

2, 设备可以连上网络,但就是请求不到数据;

3, 由于请求没有应答,设备不断发送重复数据;因此你的服务器会收到重复请求;

4, 设备或服务器收到脏数据或者部分数据;

5, 主机不可以用;

我们该如何处理?

- 你的应用要将请求保存在队列中,并能自动重试发送请求。

通过使用Apple的Reachability类(或直接使用底层SCNetworkReachability接口),不断的异步获取设备的网络可用性;但也需要了解调用这个API的短处。首先,断掉的主机也许真的不可连接了,不需要多次尝试;另一方面,可连接的主机也可能连接失败,不在收到或应答请求。此外,设备需要一段时间才能建立起网络链接,以致你需要花费一段时间才能判断出网络连接是否可用。

我发现非常有必要将网络请求保存在队列中。当网络不可到达时,我可以将先将请求填充到队列中。或者在连接失败的时候,重新尝试连接。最后,当这些请求不再有效,或者看起来请求不会再有成功的可能性时,将这些请求从队列中删除。当然,管理这个队列的策略依赖app的业务需求以及请求的性质。比方说,如果某个请求的目的是为了同步数据的话,就不值得多次尝试。而一个保存用户数据到服务端的请求,就必须保证操作成功,甚至如果重启APP的话要重新创建该请求。

-服务器端能断开请求,并能考虑重复请求。

我的绝大多数应用的网络请求都建立在http或者类似http协议的基础至少,所以服务器必须考虑不可靠网络带来的问题。

当手机在不同的基站间切换,或人们带着手机穿过隧道,并且考虑手机周围都是高楼大厦的话,手机其实在不停的失去移动网络,然后尝试重新连接移动网络。Web Kit和NSURL工具类可以轻松搞定这些异常情况,只是服务器端就会面临,建立了很多长链接,只能等待超时机制断开这些链接。如果,其中的某些请求的链接巧合是占有重要的系统资源,那么服务器就无法在处理更多请求,即使带宽非常宽裕。

同时,APP端会自动重新发送这些没有成功回复的请求。其实有的时候服务器确确实实发送了回应,只是由于某种原因没有到达手机端,这个时候服务器会收到多个一摸一样的请求。如果服务器无法分辨这个是一个重新尝试的请求,还是某个用户确实进行了多次请求,那么会给我们系统带来大麻烦。解决的方法可以这样,在请求上加上序列号,时间戳或者某种标示。

当UIWebView在加载内容的时候,我会考虑在资源不可加载的情况下,先展示内容。我是该先加载内容,再加载图片或其他资源?还是说先显示进度条,直到页面全部加载完毕?

-优雅的处理时断时续的网络或断开链接的情况。

最后,在开发app时需要考虑在网络异常情况下如何展示页面。我断然不会每次网络出问题是就弹出一个对话框。而且我也绝对不会在一连串网络错误发生的时候弹出一连串的提示框。我会尽量告知用户APP正在处理请求,一旦发生问题,用户还能继续操作,直到请求完成。

实际操作中,手机不能简单获取或推送请求,而是要同步网络情况;当某个发送请求的视图被关闭了的情况下,还要能记录请求以及回应。当请求还在传输过程中时,不能阻碍用户的继续操作。

-测试:如何创建一个非可靠网络

开发和调试时,开发环境中的网络看起来一直都很可靠,当然现实不是如此。在进行手动测试或者进行bug复现时,我会使用Charles在本地wifi网络中模拟一个糟糕的网络环境。在代理中下断点,可以有选择的中断请求,随时中断网络连接。

英文原文在这里,明天继续翻译下一章节:http://blog.carbonfive.com/2010/11/17/fallacy-1-the-network-is-reliabl/

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-29 23:03:48

通过“分布式系统的8大谬误”反思APP的设计的相关文章

通过“分布式系统的8大谬误”反思APP的设计 第六篇 谬误6:只有一个管理者

我们再回顾一下著名的分布式系统的8大谬论,以及如何在开发应用是避免这些问题. 1,网络是可靠的: 2,网络不存在时延: 3,网络带宽是无限的: 4,网络是安全的: 5,网络拓扑结构是不会变化的: 6,只有一个管理员: 7,网络传输是不需要任何代价: 8,网络是同构的. 谬误6:只有一个管理者. 作为一个开发者,你可以控制在什么时候发布新的APP或新的服务器版本,但任何人都控制不了到底有多少类型的设备在运行你的APP.用户们可以在按自己意愿更新应用,也许更本不会再更新.导致你不得不同时处理各种版本

通过“分布式系统的8大谬误”反思APP的设计 第八篇 谬误8:网络配置都是类似的

谬误8:网络配置都是类似的. 相对于web开放来讲,移动设备总是让人出乎预料.对一个应用来说,可能大多数用户所处的网络配置都类似.不幸的是,这个假设的会在某些情况下导致一些问题. 类似谬误6,不是所有的网络都有相同的配置.例如,某些wifi网络允许设备之间建立点对点的通信,有些却不支持.让移动app与其他设备通信(比方,与桌面软件)可能因此非常困难,即使它们身处同个网络内. TN2152 "传输文件的一些策略"简要总结了一些设备之间,以及远程服务之间通信的技术. 一个web服务最开始可

通过“分布式系统的8大谬误”反思APP的设计 第七篇 谬误7:网络传输无需任何开销

谬误 7:网络传输没有什么代价 Arnon Rotem-Gal-Oz's 在解释这条谬误的时候具体指出了,需要从一下两方面来看: 第一,你需要考虑应用和网络接口之间的数据传输开销.除了带宽和时延会带来开销,数据的序列化和反序列化也会影响到性能.苹果在2010 WWDC session 117"基于服务器的用户体验"的演讲中,对比了xml,json,plist这几种数据传输格式的大小以及加载时间.对比结果表明,各种数据格式的大小都差不多,但是解析的时间相差很大:解析xml需要812毫秒,

通过“分布式系统的8大谬误”反思APP的设计 第二篇 谬误2:网络没有时延

就在今天上午,我的系统的网络请求时延高达544毫秒到6937毫秒之间.而且这是在一个已激活的网络接口上.如果接口从省电模式开始激活的话,这还额外需要10秒钟的时间.因此为了提供良好的用户体验,App需要考虑至少十几秒的网络时延. 假如在app发起用户认证请求后,只有请求成功用户才能进入登录页面,这时已经过去7秒.如果接着App需要再发一条请求获取用户信息,那么用户被阻碍在登录页面总共多达14秒.所以我会尽可能打破这种必须前后按序发生的请求. 实际操作中,我会同时发送多个请求:尤其是有些请求,不占

通过“分布式系统的8大谬误”反思APP的设计 第四篇 谬误4:网络是安全的

谬误4:网络是安全的: 只要与网络服务相关,开发人员都要从开发设计以及业务需求方面考虑网络的安全性,iOS也不例外.所有最基本的攻击类型,网络服务都需要考虑:session劫持,盗取证书,代码注入等等.网络安全是个负责学科,现在先让我们考虑一些和iOS APP相关的内容. 我们只能像相信用户一样,相信用户的设备(译者:这里的意思是用户就是小白,他们不懂得如何保护自己的信息.).任何一个安装应用的人都可以深入了解到应用的内容(译者:像图片资源,私钥,任何保存在手机上的文件),也可以轻而易举获取手机

通过“分布式系统的8大谬误”反思APP的设计 第五篇 谬误5:网络拓扑结构是不会改变的

谬误5:网络拓扑结构是不会改变的 无线广域网要比WIFI网络强大的多.当建立的是长链接或是流媒体时,这一点变的非常重要.一个通过无线广域网建立的链接会保持接口处于激活状态,即使WIFI网络转化为可连接状态.为避免同时使用两个接口,由APP决定是否关闭连接,在一个新的可用接口上重新建立连接,并作出必要的处理.大家可以看一下 Paul Danbold的 Advanced Networking. 网络的切换同时也会带来设备可用带宽以及网络延时特性的变化,如果APP的工作模式依赖于这些特性的话,那么它需

通过“分布式系统的8大谬误”反思APP的设计 第三篇 谬误3:带宽是无限的

带宽并非是没有上限,而且还很昂贵.这不是简单理解为,下载大量数据需要耗费很长的问题. 1,一个超过20MB的APP是不可能通过手机网络来完成安装的:参加苹果官方的应用市场审核手册. 2,如果你的APP是需要播放视频,那么超过10分钟的视频,以及五分钟长的视频文件大于5MB的话,我建议使用实时视频流方案.先下载再观看的方式只适合短视频. 通过网络实时视频流观看的话,你需要至少需要提供一个64kbps下视频流,甚至需要支持更低带宽.(低带宽的流文件意味着只有声音,或声音配上一张静态图片). 3,音频

MAC安裝《Genymotion Android模擬器》大玩Android APP (神魔之塔)

链接地址:http://www.minwt.com/mac/10083.html/comment-page-2 MAC» 智慧型裝罝» Android | 2014/02/12 Android是一個開放的平台,因此先前也分享了幾個Android的模擬器,但當初梅干使用Android模擬器,最主要的功能就是用來測試網頁,看網頁在Android手機上是否能正常運作,雖然說這些Android模擬器,也可透過Google Player安裝Android APP,在電腦中就可玩Android APP,但由

UI设计师必须了解:2015年十大移动端APP设计主流趋势

从移动端兴起,主流设计风格定型,再到Uber.Vine等现象级APP的崛起,移动端的APP设计直到现在才渐入佳境.促成这一切的影响因素很多,比如社会发展趋势的变化.共享经济的大热.新技术的积累,等等等等.这些事物的出现需要时间积累,这也是为什么这些应用到现在才火起来. 同样的,今年我们要关注的是定型了的巨屏手机和逐渐沉淀下来的可穿戴设备. 随着日常生活中所涉及到的移动端应用的增加,用户在这些东西上的所耗费的精神和脑力也越来越多.查看邮件.预订酒店.叫外卖都有赖于各种应用,而诸如Airbnb和Gr