以前,我们解释了为什么我们决定为Genius Scan选择在文档存储服务上工作,以及我们是怎样逼近这个工程的挑战的。我们认为这个过程是值得分享得,我们也希望能够从社区获得反馈。 背景信息 在Grizzly实验室,我们创建了非常有帮助的生产率应用。我们的主要产品是Genius Scan,它是一个IOS和Android扫描器。它是最流行得移动应用之一,自从2010年6月诞生以来,网络上有超过1500万得下载量,我们从没有在广告上花一分钱,但是我们却经常收到大量的反馈。 Genius Scan是一个物理介质和数字世界之间的接口。它可以让你对一个纸质文档形成快照,纠正透视失真,并且可以将其处理的就像真的扫描仪一样。多做几次扫描之后,你可以构建一个多页PDF文档。Genius Scan也非常擅长将数据导出到任何你想要的地方(Box, Dropbox, Email, Evernote, Expensify, Google Drive, OneNote, OneDrive, FTP, WebDAV…) 当我们期望用户使用Genius Scan扫描并导出文档时,我们注意到他们中的许多人使用Genius Scan长时间存储所扫描的数据。 要解决的用户问题Genius Scan把文档存储在手机应用的本地文件夹里。由于应用是运行在沙盒里的,因此只有Genius Scan才可以访问这个文件夹,而且文档是无法在各种设备间实现同步的。除非你决定导出文件,否则这些文档是不会脱离手机的(对IOS自动备份例外)。这么做有两个优点:实现简单,隐私性强。
然而, 经过4年对支持问题的邮件答复,我们可以清晰地看到用户所要求的模型:
所有这些反馈都向我们呈现出这样的需求,即文档存储服务要具有同步功能。 自己添加的需求我们要面对的主要挑战之一就是Genius Scan已经大规模的使用了。每月数百万使用用户每天大约扫描 250,000个新文档,而且已经扫描的文档要超过2亿个。我们能找到实现新产品的方法,不过我们不能只是为了以后的扩展而设计一个简单的架构。 看起来每周一都是忙着扫描的日子,不过没有看到有人扫描火鸡啊:)
其他选择同步是非常常见的问题,可以选择许多其他方式来实现同步:
通过与旧金山和法国的几个顶级公司接触之后,再加上其他的解决方案都存在缺陷,因此我们决定着手实现我们自己的服务。 开发方式早早地确认问题所在对我们来说非常重要。不过,持续不断地列出可能出现的问题和极端情形,延缓实现则更容易些,因此我们决定采用迭代的方法实现我们的目标。 指标我们正在通过测量和调查两个渠道对我们每个月数百万的活跃用户(MAU)在服务上所产生的负荷进行评估。可以对许多指标进行测量。至于调查,我们可以在Genius Scan里显示内置的广告条来询问用户。我们还可以请求用户联系我们以获得支持。 一个重要的测量指标是普通用户(以及超级用户)通常存储多少文档。我们还希望评估每天扫描文档的最大数量。 除此之外,对用户的调查还可以让我们理解资金是否可持续:用户是否已经准备为这个服务付费了?我们是不是应该给每个用户提供功能受限的测试版呢?等等。 在安卓应用中使用Dropbox SDK起初,我们想将某种同步功能与各版本的Genius Scan整合到一块。我们首先实现了一个简单的原型,通过使用 Dropbox Sync API修改了安卓版的Genius Scan。这项工作相当快,几天时间就做了一个粗略的实现。 这样的原型有几个好处:第一,关于项目可行性方面它给了我们自信。第二,它让我们有一些具体东西可以考虑到客户端应用的用户体验;最后,识别安卓上的潜在问题通常是第一步(比如典型得同步冲突是什么,我们所期望的用户行为是什么)。 自定义实现下一步我们将开发我们自己的C/S解决方案。这一次,我们专注于IOS应用。我们使用Sinatra开发了一个简单的后台。我们服务器端的实现包含了广泛使用的IOS应用specs和Ruby。 我们得架构是基于Evernote同步。同步的核心在客户端,服务器存储状态。在某些方面来说,模型结构比较类似:在 Genius Scan中,文档包含页面,可以选择性标记。在Evernote中,笔记本包含笔记,也可以选择性标记。 我们客户端实现很好地适配了Genius Scan 以前编写的核心数据代码。另外,令人吃惊的是代码不是嵌入的:所有的同步是在各自不同的管理对象里进行的,而且管理对象间是通过分离的通知来进行通信的。 这个iOS原型使我对同步的理解更为深刻。此实现的第一次迭代花费了不到一周的时间进行开发,期间并没有出现任何冲突。 我们正在对早期的实现进行改善(有关这方面的内容,我们计划写一篇更加注重技术方面的博客文章。)。注意,这次改善仍然大量的集中在客户端,而且服务器部分是运行在本地的高速网络上的。接下来的一个行动就是在实际的网络环境下对这次改善实现的测试,其中包括网络延迟和网络出错。 结论我们两个工作在这个项目上是超级兴奋的,我们已经推迟了一段时间。我们想尽可能的快来给我们的用户提供服务。但是,我们不着急。因为我们完全没有压力,我们可以花时间将它做好。 如果你读到这了,我们对您的反馈(Hacker News)也很感兴趣。无论如何放心好了,我们会及时通知您我们的进展的。
|