27
-1 Java 技术专区技术播客系列:第 1 Aaron Miller Nitin Borwankar 谈论 CouchDB CouchOne 移动平 播出日期:2010 10 26 LANINGHAM这里是 Andy Glover 主持的一个特殊的 developerWorks 播客系列, Andy Glover 是一名开发人员、作家、演讲家和企业家。Andy Beacon50 的执行合伙 人,也是包括 developerWorks 在内的多个技术出版物的定期撰稿人。他编写了 Java 2.0 专栏。他还是屡获殊荣的 easyb(一个行为驱动的开发人员框架)的创建者。在这 里,他将与 Java 和相关技术社区的不同专家探讨各种主题,从闭包到开源商业智能,甚至 .NET。有请 AndyGLOVERAaron Nitin 都供职于一家名为 CouchOne 的商业公司,该公 司开发出了 CouchDB。那么,Aaron Nitin 谁来回答一下,什么是 CouchDBBORWANKARCouchDB 是最近人们对 NoSQL 数据库的称呼。人们一般使用它 作为一个键/值存储,用来保存属性/值对。但是 CouchDB 构建于 NoSQL 数据 库之上,拥有一个类似于 Lotus Notes 的文档模型。它几乎与 Lotus Notes 同时问世。 另外,CouchDB 与其他大多数 NoSQL 数据库的区别主要体现在两个方面:它有 一个稳健的主-主复制架构,任何其他数据库无法与之相比,第二个方面是,它虽 然被称为数据库,但它实际上是一个完整的(full-stack)应用环境。 无需安装其他任何语言模块或 Apache,就可以直接在 CouchDB 上创建完整的 HTMLCSS、和 JavaScript Web 应用程序。它是一个完整的开发环境。 GLOVER:真的吗?

DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

  • Upload
    trantu

  • View
    240

  • Download
    11

Embed Size (px)

Citation preview

Page 1: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-1

Java 技术专区技术播客系列:第 1季Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平台播出日期:2010 年 10 月 26 日

LANINGHAM:这里是 Andy Glover 主持的一个特殊的 developerWorks 播客系列,

Andy Glover 是一名开发人员、作家、演讲家和企业家。Andy 是 Beacon50 的执行合伙

人,也是包括 developerWorks 在内的多个技术出版物的定期撰稿人。他编写了 Java 开

发 2.0 专栏。他还是屡获殊荣的 easyb(一个行为驱动的开发人员框架)的创建者。在这

里,他将与 Java 和相关技术社区的不同专家探讨各种主题,从闭包到开源商业智能,甚至

是 .NET。有请 Andy。

GLOVER:Aaron 和 Nitin 都供职于一家名为 CouchOne 的商业公司,该公

司开发出了 CouchDB。那么,Aaron 和 Nitin 谁来回答一下,什么是

CouchDB?

BORWANKAR:CouchDB 是最近人们对 NoSQL 数据库的称呼。人们一般使用它

作为一个键/值存储,用来保存属性/值对。但是 CouchDB 构建于 NoSQL 数据

库之上,拥有一个类似于 Lotus Notes 的文档模型。它几乎与 Lotus Notes

同时问世。

另外,CouchDB 与其他大多数 NoSQL 数据库的区别主要体现在两个方面:它有

一个稳健的主-主复制架构,任何其他数据库无法与之相比,第二个方面是,它虽

然被称为数据库,但它实际上是一个完整的(full-stack)应用环境。

无需安装其他任何语言模块或 Apache,就可以直接在 CouchDB 上创建完整的

HTML、CSS、和 JavaScript Web 应用程序。它是一个完整的开发环境。

GLOVER:真的吗?

Page 2: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-2

BORWANKAR:是的。

GLOVER:这个我倒不太了解。您能稍微解释一下吗?

BORWANKAR:好的。实际上可以将它想象为一个数据库层,您可以像使用其他数据库层那样使用它。这个数据库层有基于 REST 的 API。换句话说,您只需通过 HTTP 动词就可以访问它。它不需要任何 JDBC 或任何驱动程序,它是完全解耦的。

不过您也可以使用一种称为 CouchApp 的模型,它支持将 JavaScript、

HTML、和 CSS 打包到一个单独的 CouchDB 数据单元中,该数据单元被称为

一个文档。CouchDB 还自带了一个 JavaScript 解释器,可以解释已经放在

那儿的 JavaScript 以及实际在 CouchDB 内部运行这块内容的

JavaScript,并提供了 HTML 页面。因此,它就变成了一台 Web 服务器和一

个瘦 JavaScript 环境(您完全可以称它为应用层),然后还有数据库本身。

Page 3: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-3

GLOVER:很多很多年以前,我做过很多服务器端 JavaScript 方面的工作。您所说的工作与这差不多吧?

BORWANKAR:是的。其中有些隐含的 JavaScript 功能适合用来编写视图,这

些视图有点像 SQL 查询,但与 MapReduce 模型关系更为密切。有一个

JavaScript 构建于这些视图之上,您可以用它来建立 HTML 页面,这些页面可

以显示项目列表或详细的项目视图。我们在内部使用了 jQuery,我们在内部使用

了 jQuery,但您可以使用任何您想要使用的 Java 功能。

这个完整的应用开发环境就是我们移植到 Android 中的环境。所以,它不仅仅

是数据库,实际上,您不必了解如何编写原生手机应用程序,就可以在手机上构

建所有类型的基于 Web 的应用程序。但我会让 Aaron 来解决所有问题。

GLOVER:在我们转到 Android 之前,您说过 Lotus Notes 有自己的一个

传统。您能深入谈谈吗?

BORWANKAR:好的。Damien 早期写了大量 CouchDB 代码,Damien Katz

现在是我们的 CEO,致力于 Lotus Notes 方面的研究,而且还在复制技术方

面拥有两项专利。后来他曾效力于 MySQL 和 IBM,最后成立了这家公司。

Page 4: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-4

他实际上想利用 Lotus Notes 的优势做点东西出来。随后他用 Internet 本

机技术(比如 HTTP、HTML 和 JSON)做出了一些东西。所以,如果您愿意的话,

可以将 CouchDB 想象成与 Internet 更加紧密集成的、更友好的 Lotus

Notes。

GLOVER:所以后来你们全部都将 CouchDB 应用程序栈移植到了 Android。

BORWANKAR:没错。

GLOVER: 你们是怎么做到的?

MILLER:嗯,实际上是将 Erlang VM(因为 CouchDB 是用 Erlang 编写的)

和 Mozilla SpiderMonkey JavaScript 引擎移植到了 Android 中,二

者在 ARM 系统上都工作得很好,因此,转移到 Android 中并没有在

Android 操作系统中去掉太多的小毛病。

Android 是一种 Linux 操作系统,但又不全是。它被修改了很多。因此,原先

预计会在这两个平台上发生的很多问题并没有出现在低级别的虚拟机代码中。

Page 5: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-5

GLOVER:那么,它仍然是用 Erlang 编写的?

MILLER:是的,仍然是用 Erlang 编写的。我们实际上是在手机上运

行一个 Erlang VM。

GLOVER:喔。再跟我多说点儿[大笑]。

MILLER:好的,Android 应用程序一般都是用 Java 编写的。

GLOVER:是的。没错。

MILLER:但是 Android 也有自己的本机开发工具包,它允许您将本机代码作

为您的应用程序的一部分进行部署,它实际上与您的 Java 应用程序和 JNI 都

有关联。

因此您可以只编写部分应用程序,然后查看它们,并使用您通常在桌面 Java 平

台上使用的 JNI 接口来加载它们。如果您的这部分代码要执行大量繁重的工作或

类似的事情,那么它们可以运行得很快。

我以前其实没有使用 NDK,因为在 Android 上总是可以运行本机代码。

Android 的 NDK 实际上只是保证在所有手机上都是相同的 API 标头集合,而

且它们在 Android 操作系统源代码版本中总是包含 Android 本机代码工具链,

您可以用它在整个 Android 系统中编译任何库,而我们则需要编译 Glib ICU

来获得 Unicode,编译 libcrypto 来生成 UUID,并在 CouchDB 中编译其

他的东西。

我们已经用本机应用程序编译了整个 VM,这个本机应用程序是由一个 Java 包装器应用加载启动的,该包装器应用程序提供了一些 Android-y 功能,因为

Page 6: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-6

Android 有很多有用的模式,您可以在自己的应用程序中使用它们,这会使得这些模式更像是提供给其他应用程序的一项服务,而不像是一个应用程序。

Android 提供了这种服务概念,您可以拥有一个提供了某项服务的应用程序,

另一个应用程序可以请求该服务,而 Android OS 将会启动您的应用程序,

只要您的应用程序要使用该服务,它就会开启该服务,并在没有应用程序使用

该服务时自动关闭它。

GLOVER:我明白了。请给我解释一下。我用的是 iPhone。我喜欢用 iPhone

是因为它的绝大部分环境都是封闭的。而看看 Android,我觉得它虽然很不错,

但我觉得 Windows 对 Android 形成了挑战,比如说,有 25 种不同的手机支

持 Android,每种手机都有自己的硬件配置,而 iPhone 显然与此截然相反,

iPhone 基本上可以说是一个硬件平台。

有多个 Android 版本或多种类型的手机会给您带来麻烦吗?或者说,您只需针

对某个特殊的 Android 版本编写代码即可,无需关心实际的底层手机设备?

Android 有那么抽象吗?

MILLER:从某种程度上讲确实如此。它相当抽象。上一个谷歌 I/O 发布之后进

行的谷歌 I/O 视频通话就是一次特别的会议,会议上谈论了针对各种可在多个手

机上使用的不同 Android 版本的编码,以及如何使其相互兼容。如果您想让某

个应用程序可以运行在所有的手机上,那么您必须考虑不同手机上的不同

Android 版本之间的大约 5、6 处巨大的差异。

当前,CouchDB 只能运行在 Android 2.1 或其更高版本上,所以我不需要考

虑一大堆的手机。我试用过的每一个 Android 2.1 或更高版本的手机都运行得

很好。

Page 7: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-7

有几件事是我们必须要考虑的,因为我们没有按照常规的方式来做事,也就是说,

我们使用了 NDK,而且只针对那些保证在各个版本之间实现 ABI 兼容的库来

编写代码。因此,只要有新的 Android 版本发布,我就必须进行检查,并确

保我们编译的库(它们不是 NDK 的一部分)没有发生改变。如果它们发生改变,

那么我就必须发布一个链接这个特殊库的单独的版本。

GLOVER:我明白了。那么怎样才能获得 Couch I/O 的这个特殊的 Android

版本?要如何安装它们呢?

MILLER:现在您就可以到任何 Android 2.1 或 2.2 手机上的 Android

Market(安卓市场)搜索“CouchDB”。另外,还有 Android CouchDB 开

发人员 alpha 版本,里面提到了我的名字 Aaron Miller,您可以下载它并

将它安装到您的手机上。它可能占用的内存有点大,但它可以正常运行。

GLOVER:可以正常运行。

MILLER:在手机上安装了桌面 CouchDB 之后,您就可以做任何您想做的事。实

际上,您可以用 Android SDK 将端口从手机传送到计算机上,然后就可以像使

用桌面 Couch 一样使用它,并使用所有桌面 CouchDB 工具(比如

CouchApp)将代码推送到您的计算机上并在计算机上运行这些代码。

Page 8: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-8

GLOVER:很好。我的下一个问题是,人们将在或能够在这个平台上构建的软件

可以在移动设备上使用吗?你们为此做了哪些工作?

BORWANKAR:我能为前一个问题补充两句吗?

GLOVER:当然可以。

BORWANKAR:设备细分不会对 CouchDB 有太大的影响,原因之一是,因为在通

常情况下,设备细分是按照屏幕上的不同功能、显示器大小、显示屏或其他诸如此

类的因素来划分的。我们基本上完成的就是服务器完成的过程,我们不用制造任何

幻想,比如说“它有 GPU 吗?”、“它显示这个、那个或其他东西吗?”或者

“它有加速器或 GPS 吗?”等。我们不需要使用所有这些东西。

GLOVER:明白了。

BORWANKAR:它基本上就是一段基于 CPU 的代码。Android 层将我们和所有

这一切隔离开来。

GLOVER:好的,我明白了。那人们能用这个做些什么呢?人们正在用它构建什么?

请解释一下。为什么我要在我的手机上运行一个像 Couch 这样的数据存储?

Page 9: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-9

MILLER:嗯,CouchDB 的一项内置功能就是同步。由于 CouchDB 采用了

主-主复制,所以它非常强健而且设计合理。您只需调用一个 API 就可以将

Internet 上的 CouchDB 与您手机上的 CouchDB 同步。您只需在

CouchDB 上调用 _replicate 句柄,从 Internet 上的这个数据库到您

手机上的这个数据库,来自这个特殊的 CouchDB 实例的所有数据都被复制到

您的手机上。

您还可以连续不断地请求执行此操作。所以它实际上会检查是否存在更新。然后,

您就可以快速将这些更新复制到您的手机上。您也可以执行反向操作,并对该数据

的子集执行相同的操作。

所有这些同步和复制功能都被内置到该数据库内部,您不必自己亲自编写代码——如

果您打算编写一个应用程序的代码,需要在 Internet 和设备之间实现正向和反

向同步的话,那么您不必亲自编写代码。

GLOVER:您所说的主-主的复制,是不是指任何节点或任何 Couch 实例能够

不依靠另一方实例来复制其自身?

BORWANKAR:没错。

Page 10: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-10

MILLER:假如您有个 Couch 实例组成的网络,它们是相互复制出来的,那么

其中一个节点停止工作不会影响整个网络,您随时可以对任何节点执行写入操作。

BORWANKAR:让我来例举一个关于您可以在手机上使用 CouchDB 做什么的更

直观的例子。在使用 3G 或 4G 业务之后,当您连接到 3G 或 4G 网络时,

您就能够在手机上完成所有这些操作。但是,如果您无法连接到 3G 或 4G 网

络,您的数据只能滞留在云中,您的手机就无法访问这些数据。

GLOVER:所以说,即使您有一部 AT&T 手机,也无法访问这些数据。

BORWANKAR:好的,我不想这么说,但最重要的是,无论您连接的速度是多少,

只要连接不上,一切都是空谈。这两者之间的可比性可以忽略不计。

CouchDB 允许您随身携带一部分自己的数据,而用户体验是:您在快速运行,

因为手机上的 Web 浏览器正在与本地 CouchDB 应用程序进行通信。它没有

与云中的应用程序进行通信。

这背后的原理是,您手机上的 CouchDB 正在与云中的 CouchDB 进行通信。所

以您总是体验到 Web 浏览器和 Web 服务器之间的高速通信,因为它们位于您

的手机上。

在这里,附带的好处是:如果我位于旧金山湾区,我们有一个称为 BART 的高速

运输系统,并且这里有很多的隧道,如果您位于 BART 系统中,已经建立信号连

接,接着您进入一个隧道,信号连接中断了。在您出了隧道后,信号又连接上了。

然后信号又断掉了。因此用户能够明显地体验到信号中断情况。但是,如果您在

Page 11: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-11

手机上使用了 CouchDB,那么过渡过程中的信号连接将会是无缝的。

GLOVER:是的,是的。

BORWANKAR:您会继续做您的工作。每次从隧道出来,您无需做任何事情,不用

执行刷新或类似的操作,应用程序会持续运行。如果手机发现可以建立连接,那

么它就会去尝试建立连接。如果数据有所不同,那么系统就会将它们同步。

我们正在实现建立连接和中断模式之间的平稳过渡。这对编写手机应用有着深远的

影响。

Page 12: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-12

GLOVER:这点毫无疑问。

BORWANKAR:我们要讨论的第二部分内容是:直到现在(Aaron 谈论过这方面

的内容,但我想再强调一下),如果您要立刻编写一个手机应用程序,作为一名

应用程序开发人员,您必须考虑将您的数据与云同步(如果您的应用程序需要的

话)。基础架构或操作系统没有给您提供任何东西。同步是您要考虑解决的问题。

借助 CouchDB,应用程序开发人员就不必再担心同步问题。他们可以编写应用

程序,将数据保存到本地 CouchDB,然后同步操作就会在后台自动进行。对应

用程序开发人员来讲,这是一个巨大的胜利。

MILLER:一个非常有趣的影响是,如果您已经在后端的某个地方使用了

CouchDB,那么您已经有了一个可以通过 HTTP 为您的 JSON 格式的数据提供

服务的数据库,您可以请求访问这些数据。

您可能已经编写了一个移动应用程序,那么无论何时需要数据,您都可以请求从

Internet 获得该数据。如果 CouchDB 最终能够出现在您正为其开发应用程

序的手机上,那么您就能够让该手机上的 CouchDB 与 Internet 数据库同步,

不是将您的应用程序指向 Internet 数据库,而是将它指向手机上的数据库,

无需编写额外的代码,您的应用程序现在可以离线运行了。

Page 13: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-13

GLOVER:当然。这真是一场巨大的胜利,我可以想象得到。但是让我再回到

刚才的问题。对于我们的听众而言,他们可能像您说的那样,对 NoSQL、面

向文档的数据库以及您刚才提到的 Lotus Notes 不甚了解。

我 10 多年前用过 Lotus Notes。请告诉我,如果我有一个 Web 应用程

序,或者我正在查看数据存储,我能使用 Couch 做什么?我非常同意,这是

一次巨大的胜利。如果我编写了一个使用了 Couch 的 Web 应用程序,突然

之间,我拥有了一个 Web 应用程序,或者说我的应用程序可以用于移动设备

了,但我可以使用 Couch 编写什么样的应用程序呢?是典型的普通 Web 应

用程序(比如说电子商务、购物车或 Twitter 集成),还是上述的所有应用

程序?

BORWANKAR:上述的所有应用程序。有一些数据模型,它们的关系型数据库处理

得不是很好,这些数据模型有着多对多的关系。

使用 CouchDB 实现这些应用程序有一点困难。但我们见到的大多数应用程序实

际上并不需要管理大量的多对多关系。只有少部分应用程序会这样做。

Page 14: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-14

所以大多数应用程序(至少是大多数应用程序中的主要部分)可被转换成为

CouchDB 应用程序。而 CouchDB 关注的是文档。它实际上是一个 JSON 对

象,而且 JSON 值可以是其他 JSON 对象。换句话说,可以对它们进行嵌套。

因此,通常情况下,您有一张表、另一张表、一个外键和一对多的关系(您可以

将它想象成为一家公司和各个部门),您将用它们来表示这里的公司,于是您将

有一家公司,在公司内部,您会有一个称为“division”的属性,它只是一个

JSON 格式的 ID 列表,而且它代替了一对多的外键。

因此,您的模型与 CouchDB 数据模型稍有不同。最后,当您开始实际编写这些

Web 应用程序时,它们具有更强的独立性,有关某件事的所有数据都被汇集在一

起。

数据表示则更加不规范,在关系型数据库中,数据表示更规范化一些,被分门别

类地单独表示。因此您可以从不同的视角审视您的数据,采用不同的方式安排您

的数据,而且您可以获得许多好处。

GLOVER:好的。让我们回到 NoSQL、非结构化、面向文档的数据库和传统的

更多关系的数据据库的话题上来。我很好奇 ACID 的概念,ACID 一直是关

系型模型的领头羊。CouchDB 符合 ACID 的规范吗?

Page 15: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-15

BORWANKAR:不符合。当您有两个主-主节点时,如果有人更新了其中的一个,那

么在几百万分之一秒内,两者是不一致的。所以这类数据库不能满足所有需求。但

是,除非您正在执行比如说大量的银行业务之类的操作,否则许多需求是不必要的。

因此您可以对关系型数据库使用主-主节点,但是,如果使用的数量多了,就会产

生日常开销,很多应用程序都是这样。

GLOVER:好的,好的。

BORWANKAR:我不会建议您建一个巨大的交易厅来存放 CouchDB,对于不想

为每个操作提供如此多的日常开销的企业,您可以在企业内部做许多其他的工作。

GLOVER:好的。那么您认为 CouchDB 是“终极一致”模型码?

MILLER:是的。

BORWANKAR:好的。

Page 16: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-16

GLOVER:完全正确。那么 CouchDB 也有“事务”的概念吗?

MILLER:只在文档上有。

GLOVER:好的,那是什么意思?

MILLER:如果您要修改一个文档,而在您检索到它时,它已经被修改了,那么

您的修改将会失败。无论何时下载一个文档,它总是有一个修订 ID。只要您更

新该文档,修订 ID 就会随之改变。

因此,无论您何时您向 CouchDB 发送一个更新,都必须将已经获得的修订 ID

包含在内,这样计算机就可以知道自从您上次检索到该文档后,该文档是否被修

改过。

GLOVER:我明白了。

BORWANKAR:将事务看作文档的另一种思考方式是,它类似于我们常见的模式:

您从活期帐户中取钱,将它存到定期帐户中。如果您取出钱之后还没来得及存钱,

而系统碰巧在此时崩溃了。可以这样思考吗?通常,在关系型数据库中,这被算作

两次不同的操作:一次取钱,另一次存钱,通常会用一个“事务”将这两次操作封

装起来,对吗?

Page 17: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-17

在 CouchDB 中,您会将这两个操作放入一个文档中,而 CouchDB 需要保

证文档更新是原子的。因此文档从来不会只写到一半。

GLOVER:我明白了。

BORWANKAR:这个文档要么被完整编写,要么不存在。如果您将这两个操作视

为从活期帐户中减去 10 美元,并向定期帐户中添加 10 美元,那么您可以

将它们放到一个 CouchDB 文档中,然后保存该文档。然后在您做报告的时候,

它们将是一致的。

如果您可以在单个文档中为您的事务建模,那么您就可以为事务建模。但是您不

能将这理解为一种典型的事务数据库。

GLOVER:好的。下面让我们回到主-主复制和传统数据库的话题上来。如果您

想要复制数据,比如说,想要复制两个数据库。一个特殊的问题显然就会蹦出来,

这个问题就是主键;比如说,如果您有两个不同的数据库,而您想要试着将它们

合并成一个主数据库和两个复制数据库,那么系统会崩溃。

Page 18: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-18

对于在配置的时候不知道彼此的几个数据库,你们如何在这些数据库之间处理键同

步问题?

BORWANKAR:我认为这就是 Aaron 之前正在做的事情,我会让 Aaron 继续

这方面的工作。不过 CouchDB 生成了它自己的键,称为“UUID”。我要让

Aaron 继续深入研究更多的细节。

MILLER:好的。每个文档都有一个由 CouchDB 自动生成的 UUID。如果愿意

的话,您可以提供自己的 ID。如果不愿意这样做的话,那么所有文档都会有一

个随机生成的 ID,因此您任何时候……

BORWANKAR:必须确保这些 ID 都是惟一的。

MILLER:是的。它们保证是惟一的。因此,无论何时您从两个完全不同的、没有

任何联系的数据库中复制数据,只要数据完全不同,就不会产生任何键的冲突。

如果两个数据库中的数据相同,然后,您修改了其中一个数据库中的数据,并修改

另一个拥有相同 ID 的数据库中的同一个文档,那么以后无论何时将它们复制到

第三个数据库,都会产生冲突。

Page 19: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-19

由于我们有多个主节点,所以实际上很有可能出现这种情况,如果在两个节点上执

行了一些更改,然后它们被复制到第三个节点,那么您就会拥有该文档的两个不同

的版本。

在这种情况下,CouchDB 会将两个版本的文档都保存下来,并将其标记为冲突状

态,然后选择最后保持一致的那个文档来使用。

如果要复制所有数据,系统会挑选处于冲突状态的那些文档版本中的一个来使用。

但它会告诉您该文档处于冲突状态,这样您就可以告诉最终用户,“嘿,我有三个

相关的副本,其中一个是正确和准确的,或者说,您愿意合并它们吗?”您可以利

用数据库为您提供的信息,通过编程来执行所有这些操作。

GLOVER:喔。这真是太棒了。显然,如果您希望同时拥有多个数据库实例并运

行它们,那么这种做法非常方便,我曾经对 MySQL 数据库实现过该操作。不

过,对 MySQL 数据库执行该操作需要稍微多做一些工作。

BORWANKAR:是的,我也认为它有点脆弱。如果您将主节点设置为两个不同的方向,那么数据很容易崩溃。

GLOVER:嗯,是的。所以我必须要问:Couch 有没有可能在 iPhone 上运行?

MILLER:有的。我现在正全力以赴做这方面的工作。

GLOVER:太好了。

BORWANKAR:可以这么说,我们差不多已经在实验室中实现了它在 iPhone

上的运行,但在提供给其他人使用之前,我们还需要将它完善一下。

Page 20: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-20

GLOVER:好的。Aaron,您正在做这方面的工作对吗?

MILLER:是的。

GLOVER:那么说您研究的是移动平台?

MILLER:是的,我研究的是移动平台。我认为我差不多已经是移动操作系统方面的大拿了。

[大笑]

BORWANKAR:他是手机大拿(双关语,另一个意思是“对着手机低声说话的人”)。

Page 21: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-21

GLOVER:非常好,非常好。我们从哪儿可以找到一个可获得关于 Couch 的

更多信息的社区?显然,我们想了解 Couch 是否可以在 Android 上运行?

BORWANKAR:有一本 O'Reilly 公司出版的图书,纸质版。另外,如果您在

Google 上查询“CouchDB book”,就可以在网上找到相关信息。这是从零开

始学习 Couch 的最佳途径。不过,还有 Apache 网站和维基可供参考。

这里还有一个为用户准备的邮件列表,它是一个非常帮的、能为用户提供帮助的

社区。另外还有一个 IRC 频道:CouchDB。所有这些资源均可用。我刚开始

使用 CouchDB 的时候,从这些地方获得了许多的技术支持,我的问题也有人

解答,并且还与很多我现在的同事建立了联系。

GLOVER:我能从 Android Market 下载 Android 版本吗?

MILLER:可以。在 Android Market 搜索“CouchDB”就会找到当前受支持

的手机的版本。

GLOVER:我明白了。

BORWANKAR:受支持的版本包括 2.1 版或更高版本。

GLOVER:好的。IBM 的 developerWorks 上也发表过一篇有关 CouchDB 的文章,至少我知道有这么一篇文章。有关 Android 的文章更是不计其数。

最后一个问题是问你们二位的,因为你们都效力于 CouchOne。在其他各种各

样的播客中,我有幸与很多供职于开源技术公司的人进行了交流。你们是通过服

务进行盈利的吗?CouchOne 是如何利用 CouchDB 盈利的?

BORWANKAR:我们目前的重点是不联网的数据,也就是移动数据,非不是手机,

Page 22: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-22

但是平板电脑和新世界中出现的任何新设备要求您随身携带您的数据的副本。所

以,如果您想在移动平台上构建一个应用程序,而想要将数据托管在云中,那么

我们将会提供托管服务,如果您愿意的话,也可以称之为后端。

我们的主要盈利模式是(主要盈利模式中的一种)为数据和应用程序提供托管服

务。第二种盈利模式是利用此平台并创建它的企业版,提供技术支持,并将它与

监视工具、部署工具和用于防火墙部署的其他所有工具捆绑在一起。

GLOVER:因此,提供托管服务的站点是 couch.io 站点吗?

Page 23: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-23

BORWANKAR:不是,是 couchone.com。从 hosting.couchone.com 也能

连接到该站点。

GLOVER:它在哪里?你们使用……您说过云。这就是 EC2 吗?

BORWANKAR:是的。我们目前正在使用 EC2,但最终我们会有多个地方托管这些

数据。

GLOVER: 真棒。太让人兴奋了。

BORWANKAR:是的。

MILLER:是的。

BORWANKAR:很多人都在 couchone.com/get 进行了注册。它当前是免费的。

所以我鼓励大家都去访问 couchone.com/get。

MILLER:从零开始学习 CouchDB,您无需下载或安装它,只需在 Internet

上得到一个 CouchDB 实例即可。因为您是通过 HTTP 访问它的,所以只需获

得一个已经为您设置好的一个实例即可。

BORWANKAR:是的,无论采用哪种方式都可以访问它。如果您想在笔记本电脑上运行它,您可以下载一个实例或立即到网站上注册。毫不夸张地说,您半分钟内就可

以获得一个托管的 CouchDB 实例。

Page 24: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-24

GLOVER:太棒了。那么说我可以实时使用 Couch 了。我可以下载它,然后在

我的笔记本电脑上使用它。如果我有一个 Android 系统,那么我立刻就可以使

用它。如果您喜欢 iPhone,不久之后您就能使用它了。

BORWANKAR:没错。最后一件事:您问过一个问题,提到了一些有关 CouchDB

的播客和资源。我想说,在最近的两个版本中,很多关于 CouchDB 的东西都已

经改变或改进了,网上能查到以前的许多关于 CouchDB 的信息。

对于 2009 年以前的所有信息,我会尽可能去寻找更新的版本。最近的版本

中添加了许多特征和功能,以前的文章中没有这些特征和功能的介绍。书籍是

非常不错的参考点,接下来是用户社区、IRC 频道、用户列表以及 Apache

维基,这些都是获得最新信息的好地方。

GLOVER:太好了。好的,我非常感谢你们两位百忙之中抽出时间来此做节目。

我知道我是代表收听这个播客的很多听众来与你们对话的。非常感谢你们今

晚告诉我们这么多有关 Couch 和移动平台上的 CouchDB 的信息;我们对

CouchOne 和 CouchDB 社区寄予了很高的期望。

Page 25: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-25

MILLER:好的。

BORWANKAR:最后,我还想说,我不太肯定我是不是在前面已经提到过,我们

与 SpringSource 在 CouchDB 的 Java 层上有密切的合作,所以您可以

把它集成到企业版中,让企业开发人员通过常用的工具(比如 Eclipse 等)

来使用 CouchDB 变得更简单。

GLOVER:非常有趣。我们应该尽快谈谈这方面的问题。

BORWANKAR:好的。

GLOVER:显然,您目前了解 Couch 的方式(就像您所说)是通过 RESTful

HTTP 调用。您是不是说今后会有一些人们可以使用的核心 Java 库,然后人们

可以用它们与 Couch 进行通信?

BORWANKAR:是的。如今已经有了一些 Java 库,还有一些称为 jcouchdb 的

库。目前我们已经有了两个或三个 Java 库,就像其他任何语言一样。有许多用

于 Couch 的语言库,但这类库仍然很少。它们基本上对您隐藏了所有 HTTP 细

节,它们采用了来自 Couch 的 JSON 对象,将这些对象封装在您的本机域对象

中,不管它是 Python、Ruby 还是 Java。

Page 26: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-26

因此会有这些库的 Java 版本。SpringSource 要做的实际上是……CouchDB

拥有内容极为丰富的 API。大多数时候,您只需使用其中很小的一部分。但

SpringSource 开发人员要编写一个用来实现所有 API 交互的 Java 层,这

些 API 交互包括监视、性能监视,以及各种各样的内部功能。这使得 CouchDB

拥有大量的 API。但这些 API 目前还没有全部完成,我们才刚刚开始创建这些

API。

GLOVER:这太棒了。我认为现在对 Java 社区、Ruby 和一般的开发社区而

言是一个激动人心的时刻,我期待看到最终的结果,看看 SpringSource 和

CouchOne 的合作会产生什么样的成果。那一定非常有趣。

MILLER:是的,是的。

GLOVER:好的,小伙子们。再次谢谢你们抽出时间来到这里。我希望看到你们带

来更多的成果。

Page 27: DVW-9076 CouchDB clean - ibm.com · PDF file-1 Java 技术专区技术播客系列:第1季 Aaron Miller 和 Nitin Borwankar 谈论 CouchDB 和 CouchOne 移动平 台 播出日期:2010

-27

BORWANKAR:非常感谢您邀请我们做这次访谈。

MILLER: 感谢您的盛情邀请。

LANINGHAM:这里是 Andy Glover 主持的 developerWorks 播客。请在

iTunes 和 ibm.com/developerworks 上关注我们。具体地讲,请在

ibm.com/developerworks/java 上随时关注 Andy 的访谈系列。感谢大家的收

听。

[访谈结束]