PS: 由于本人英语水平比较烂,为了尊重大家的阅读习惯,我采用了对照翻译的方式来翻译,有什么翻译不好的地方,请大家指出,但请不要嘲笑我,因为我为我的英语水平已经够自卑了。再次感谢。
【作者】:Google
【原文】: http://code.google.com/apis/gears/architecture.html
Google Gears API Developer's Guide (Beta)
【翻译】:谷歌Gears应用程序接口开发者指南(Beta)
Choosing an Offline Application Architecture
During development of Gears, we experimented with many different architectures for offline-enabled web applications. In this document we briefly look at some of them and explore their advantages and disadvantages.
- isolating the data layer
- deciding which features to implement offline (connection strategy)
- deciding on the app's modality
- implementing data synchronization
- 分离的数据层
- 决定是什么特征实现离线(连接策略)
- 对应用程序的形式做出决定
- 实现数据同步
Isolating the Data Layer
Figure: No data layer
Architecture with a data layer
In general, isolating the data layer is a good first step.
【翻译】: 通常,分离的数据层是好的第一步。
【翻译】: 当你为你的应用程序增加一个本地数据存储时,你将有一个单独的位置用来处理你所有的数据存储以及取回经过的请求。
Figure: Data Layer
【翻译】: 例如,如果你的AJAX应用程序传出一个JSON给服务器获取一个用户的所有帐务,你可能改为请求一个中间对象来取代从服务器读取这个用户的所有帐务。这个对象来决定从服务器,本地存储,还是二者结合的方式重新找回数据。同样的,当应用程序想要更新用户帐户信息的时候,这个应用程序也是去调用这个中间对象。这个中间对象可以决定是否在本地写数据,还是将它们发送到服务器上,这些通过中间对象来决定。
【翻译】: 你可以将这个中间对象考虑成一个数据开关层,它负责实现和数据层相同的接口。第一步,你可以让使你所有的数据开关调用所有你的数据层以与你的服务器相结合。如果Google Gears没有被安装或者用户不想让应用程序离线工作,则这个步骤是非常有用的。注意这个数据开关并不是确实必要的(例如GearPad就没有数据开关层)
Figure: Data Switch Layer
【翻译】: 下一步,也是关键的一步,就是创建一个本地的数据层来使用Google Gears数据库代替访问WEB服务器上的数据。如果这个数据层拥有和已经存在的数据层相同的接口则与服务器通信将变得容易。如果这些接口不同,你则需要在这个数据层内做一些数据翻译的工作。
Figure: Local Data Layer
Architecture without a data layer
【翻译】:没有数据层的结构
【翻译】: 如果这个应用程序没有一个数据层结构,并且添加一个数据层是无法选择的,这个数据层仍然可能通过中途阻止所有的发向WEB服务器的请求来分离数据层。例如,你可以截断一个窗体的提交(监听提交事件)并且决定应用程序究竟该使用本地数据存储还是服务器上的数据存储。
【翻译】: 实现这个步骤包括寻找所有发送请求给服务器的函数和方法,对它们重新路由。这个方法的挑战性在于他要求很多额外的工作量,就像分解URL, 迭代表,以及生成和服务器可以生成的相同的结果. 事实上你重新实现WEB服务器客户端部分中很大的一部分。不管怎样,这个是对一个已经存在的AJAX应用程序可行的一个选择,不能被其他方式重构。
Feature Availability Offline
【翻译】: 因为实践的原因,每一个应用程序的特征可能不会成为可用的离线的特征。你需要选择哪个特征是你想要支持的本地地并且实现这个逻辑来决定什么时候使用本地存储,什么时候使用服务器连接。我们称这个为“连接策略”。
You might think that you would always want to use the local store since it is faster. However, there are many practical reasons why you may want or need to access the data on server instead. For instance:
- Data may be so transient in nature that it makes no sense to cache it.
For example, an application providing real-time stock quotes would not benefit from serving old stock quotes. - Some application's data makes sense only while online.
As an extreme example, an Instant Messaging application makes sense only while connected. - The app may choose to store only the most frequently accessed data.
For example, if the user can set a preference that changes the language of the application, this preference change might not be supported offline because the cost of implementing this offline feature is not worth the benefit for a preference that is seldom changed. - Computational and/or disk space requirements make it unfeasible to recreate the feature offline.
For example, if the feature requires huge amounts of data to be useful, beyond a reasonable amount for a personal computer.
- 数据可能是瞬时的,缓存它们将没有意义。例如,一个应用程序提供一个实时股票报价,那么旧的数据将没有意义。
- 一些应用程序的数据只有在线的时候有意义。一个极端的例子,一个即时消息应用程序只有处于连接的状态才有意义。
- 应用程序可能选择频繁访问数据存储。例如,如果一个用户设置它们的语言偏好,这个偏好的改变可能不需要支持离线,因为这样的偏好几乎很少改变,实现它们的离线则不值得。
- 计算和/或磁盘空间是否可以实现离线特征。例如:如果这个特征请求大量的有用空间,超出一个合理的个人电脑的空间总量。
One fundamental question that all offline-enabled applications must answer early is that of "modality".
- Modal applications have distinct offline versus online modes, usually indicated through some change in the user interface. The user is made aware of the state and participates in switching states in some manner.
- Modeless applications attempt to transition seamlessly between online and offline states, without significant UI changes. The user does not need to participate in switching states, which the application does automatically.
- 模态应用程序离线和在线模式有明显的区别,通常需要一些用户界面的改变。用户需要知道状态并且在一些风格中参与交换状态
- 非模态应用程序尝试着让在线和离线之间无缝集成,没有重要的界面改变。用户不需要参与交换状态,这样的应用程序变得自动。”
Modal
【翻译】:模态的
【翻译】:在一个模态应用程序中,当应用程序是在线的,它与服务器进行通信。当它是离线的,它使用本地存储,数据必须在应用程序转变模式的时候进行数据同步。
【翻译】:优势:使用一个模态应用程序的优势在于它的实现相对简单,所以它提供了一个解决应用程序离线的合理的方法
The disadvantages are:
- The user must remember to switch modes. If they forget, they will either not have the data they need when offline, or will work online in an unintentionally disconnected mode.
- If the network connection is intermittent, the user will either need to choose one of the settings or will have to constantly switch between modes as the connection comes and goes.
- Since the local store is not always up-to-date, it can't be used to improve the application's responsiveness when connected to the server.
- 用户必须记住交换模式。如果它们忘记了,它们将在离线的时候无法得到它们所需要的数据,或者当它们在线的时候它们无意识地在离线模式下工作。
- 如果网络链接是断断续续的,用户将需要不断地随着网络状态的改变切换程序的模式。
- 因为本地数据库并不总是最新的,它不能在连接至服务器的时候被用于改进应用程序的响应
Modeless
【翻译】:非模态的
The advantages of modeless applications are:
- A better user experience. The user does not have to be aware of network connectivity or switching states.
- The application works smoothly even with intermittent network connections.
- Since the local store is kept up-to-date, it can be used to optimize the server connection.
- 更好的用户体验。用户不需要知道网络的连接情况和交换状态。
- 应用程序甚至可以在是断断续续的网络条件下平稳地工作。
- 因为本地存储保持最新,它可以使用最优化的网络连接。
The disadvantages of modeless applications are:
- It is more difficult to implement.
- Care must be taken to avoid letting the synchronization background process consume too many resources and make the overall application feel sluggish.
- Testing the app can be more challenging, since synchronization logic occurs in the background and not in reaction to specific user actions.
- 实现比较困难.
- 必须要注意保持同步的后台进程不会消耗过多的资源而导致应用程序变得缓慢。
- 应用程序的测试也是一个挑战,因为同步逻辑发生在后台,并且没有明显的用户举动。
【翻译】:Google Reader则是一个模态应用程序的例子。它有一个明显的离线模式,用户必须使他可用。根据读者的场合,实现一个实际的选择来决定状态,就像它们快速来实现并且使一个早期版本的Google Reader通过Gears变成可能
Data Synchronization
No matter which connection and modality strategy you use, the data in the local database will get out of sync with the server data. For example, local data and server data get out of sync when:
- The user makes changes while offline
- Data is shared and can be changed by external parties
- Data comes from an external source, such as a feed
- 当离线的时候用户改变数据
- 数据被共享并且可以被外部改变
- 数据来自一个外部源,就像一个feed
Resolving these differences so that the two stores are the same is called "synchronization". There are many approaches to synchronization and none are perfect for all situations. The solution you ultimately choose will likely be highly customized to your particular application.
Manual Sync
【翻译】:手动同步
【翻译】:最简单的解决方案就是手动同步。之所以称之为手动是因为让用户决定什么时候进行同步。它可以被简单地实现为上传所有旧的本地数据给服务器,并且在变成离线状态前从服务器下载最新的拷贝。
Manual sync requires that:
- The amount of data is small enough to download in a reasonable amount of time.
- The user explicitly indicates when he or she is going offline, typically via a button in the user interface.
- 总的数据是足够小的以保证在一个合理的时间内进行下载。
- 用户明确指示什么时候他或者她将要离线,典型的通过一个设置一个按钮来实现这个功能。
The problems with this method and with the offline mode it creates, are:
- Users don't always know the state of their network connections. Internet connections may die unexpectedly or be intermittent, for example, on a bus.
- Users may forget to synchronize before going offline.
- 用户并不总是知道他们网络连接的状态。互联网连接可能出乎意料地中断了或者断断续续,例如,在一个公交车上。
- 用户可能忘记在它们将要离线的时候进行数据同步。
【翻译】:手动同步可是以一个好方法的开始因为它相对容易实现。然而,它要求用户知道并且包含进同步的过程中。
Background Sync
【翻译】:后台同步
The benefits of background synching are:
- Data is ready at all times, whenever the user chooses to go offline, or is accidentally disconnected.
- The performance is enhanced when using a slow Internet connection.
- 数据在任何时候都是准备完毕的,无论用户选择离线还是意外断线。
- 当使用一个缓慢的互联网连接的时候这个表现就有所提高了。
Figure: Background sync architecture
Conclusion
【翻译】:结论
【附加】
Samples and Tools download
All of the sample applications and the tools described below are found in the zip file provided here. Download the file to your computer and unzip it to access the files.