Electronic Joint Business

Solution for E-Business

json

通过 C# 使用 ZeroMQ (二) 多段式消息,JSON 和同步发布/订阅模式

文章评价:

这是该系列文章的第二部分。在这部分文章中,我们会讨论 ZeroMQ 所能发送和接收的两大类消息,并且如何用 JSON 来格式化消息。我们还会学习 如何使用轮询 (polling) 机制。在文章的最后,我们举例说明什么是同步发布/订阅模式。

ZeroMQ消息
ZeroMQ 套接字可以发送或者接受单段式消息(single-part)或多段式消息(multi-part)。

单段式消息
所谓单段式消息,就是一个消息只包含一帧。所谓帧是一个字节数组,其长度可以零以上的数值。在 ZeroMQ 参考手册中,帧也被叫做“消息段 message parts”。

举个单段式消息的例子,就比如说上一篇文章中我们发送/接收的所有消息都是单段式消息。在发送和接收的操作中,我们使用的是字符串,而字符串实质也是一个字节数组。

>>> 阅读全文

 

, , , ,

面向文档数据库CouchDB (五) 高级话题

权限控制与安全

CouchDB 目前只支持一种角色,即“系统管理员”。“系统管理员”可以执行任意的 HTTP REST API 对数据库进行任意的修改。可以在 CouchDB 的配置文件中添加系统管理员的帐号和密码。 CouchDB 也自带对 HTTP 基本认证的支持,同样可以在配置文件中启用这一认证方式。

由于目前 CouchDB 对于权限控制功能比较弱,一种比较好的做法是用 Apache HTTP 服务器作为 CouchDB 的反向代理,由 Apache HTTP 服务器来处理访问控制。关于配置 Apache HTTP 服务器,见参考资料。

文档更新校验

CouchDB 允许文档在创建和更新之前先进行校验。只有校验通过的文档才能被保存在数据库中。校验方法是由设计文档中的validate_doc_update字段来表示的。所有的文档更新都会调用该方法,如果该方法抛出异常,则说明校验失败,CouchDB 会返回异常中的错误信息给客户端。

>>> 阅读全文

 

, , ,

面向文档的数据库 CouchDB (四) 视图

视图是 CouchDB 中用来查询和呈现文档的。完成视图的定义之后,视图的运行由专门的视图服务器来完成。 CouchDB 中默认的视图定义语言是 JavaScript 。 CouchDB 中的视图运行使用的是 MapReduce 编程模型。每个视图的定义中至少需要提供 Map 方法,Reduce 方法是可选的。

视图的 MapReduce
Map 方法的参数只有一个,就是当前的文档对象。 Map 方法的实现需要根据文档对象的内容,确定是否要输出结果。如果需要输出的话,可以通过emit来完成。emit方法有两个参数,分别是key和 value,分别表示输出结果的键和值。使用什么样的键和值应该根据视图的实际需要来确定。当希望对文档的某个字段进行排序和过滤操作的时候,应该把该字段作为键(key)或是键的一部分;value的值可以提供给 Reduce 方法使用,也可能会出现在最终的结果中。可以作为键的不仅是简单数据类型,也可以是任意的 JSON 对象。比如emit([doc.title, doc.price], doc)中,使用数组作为键。

通过 Map 方法输出的结果称为中间结果。中间结果可以通过 Reduce 方法来进一步做聚集操作。聚集操作是对结果中键(key)相同的数据集合来进行的。 Reduce 方法的输入不仅是 Map 方法输出的中间结果,也可以是上一次 Reduce 方法的结果,后面这种情况称为 reReduce 。 Reduce 方法的参数有三个:key、values和rereduce,分别表示键、值和是否是 reReduce 。由于 reReduce 情况的存在,Reduce 方法一般需要处理两种情况:

  • * 传入的参数rereduce的值为false:这表明 Reduce 方法的输入是 Map 方法输出的中间结果。参数key的值是一个数组,对应于中间结果中的每条记录。该数组的每个元素都是一个包含两个元素的数组,第一个元素是在 Map 方法中通过emit输出的键(key),第二个元素是记录所在的文档 ID 。参数values的值是一个数组,对应于 Map 方法中通过emit输出的值(value)。
  • * 传入的参数rereduce的值为true:这表明 Reduce 方法的输入是上次 Reduce 方法的输出。参数key的值为null。参数values的值是一个数组,对应于上次 Reduce 方法的输出结果。

下面通过一个实例来说明视图 Map 和 Reduce 的用法。该视图要解决的问题是对图书简介中出现的字符进行计数,这也是一个经典的 MapReduce 编程模型的实例。代码清单 12中给出了该视图的定义。

清单 12. 对图书简介中的字符计数的视图定义

>>> 阅读全文

 

, , , ,

面向文档的数据库 CouchDB (三) 开发Web应用

CouchDB 不仅是一个数据库服务器,同时也是一个应用服务器。在前面对 REST API 的介绍中,说明了如何把 CouchDB 作为一个数据库服务器来使用。下面将介绍如何将 Web 应用运行在 CouchDB 上。

由于 CouchDB 的 REST API 使用 JSON 作为展现形式,因此使用 CouchDB 的 Web 应用只需要编写浏览器端的代码就可以使用 JavaScript 与 CouchDB 进行交互;而 CouchDB 所支持的附件功能,又使得浏览器端的 HTML、JavaScript 和 CSS 代码可以直接存放在 CouchDB 中。这样 CouchDB 中不但保存了 Web 应用的数据,也保存了 Web 应用的逻辑。也就是说,只需要 CouchDB 就可以构建一个完整的 Web 应用运行环境。

在 CouchDB 中,一个 Web 应用对应的是一个设计文档。这个 Web 应用可以操作 CouchDB 中保存的文档型数据。当需要创建新的 Web 应用的时候,只需要创建新的设计文档即可。 CouchDB 使得 Web 应用的部署和管理变得非常简单,只需要通过 REST API 管理设计文档即可。从更大的角度来说,CouchDB 有可能创造一种新的 Web 应用开发模式。在这种模式中,CouchDB 中保存的文档型数据可以为每个应用开发者所使用,开发者在数据之上创建满足各种需求的 Web 应用。

本文中将以一个具体的小型网站作为实例来介绍使用 CouchDB 开发 Web 应用中的细节。该网站是一个类似“豆瓣”的用户点评网站。在该网站中用户可以对图书进行编辑和评价。

使用 CouchApp
CouchApp 是一个开发使用 CouchDB 的 Web 应用的小型框架。它的主要功能是可以把一个文件系统的目录转换成 CouchDB 中的一个设计文档。在开发的时候,可以按照一般 Web 应用的结构来组织文件系统,当需要测试和部署的时候,只需要一条命令就可以把该目录保存到 CouchDB 中。 CouchApp 目前有 Python 和 Ruby 两种语言的版本,本文中使用的是 Python 版本。由于目前 CouchApp 正在开发中,所以最好是从源代码安装。代码清单 7 中给出了 CouchApp 的安装脚本。

>>> 阅读全文

 

, , , ,

面向文档的数据库 CouchDB (二) REST API和建模

CouchDB 提供 REST API 来供客户端程序使用 CouchDB 的功能,并对数据库进行操作。REST API 主要针对 CouchDB 中的三种资源:数据库、文档和视图。下面分别介绍这三种 REST API 的细节。

数据库 REST API

数据库 REST API 用来查询、创建和删除数据库。 CouchDB 中数据库的名称只能是小写字母、数字以及特殊字符_$()+-/。需要注意的是大写字母是不允许的,这是由于某些操作系统的文件系统是大小写不敏感的。 CouchDB 为了避免可能出现的问题,限制了不能使用大写字母。数据库 REST API 的具体用法如下:

  • * 通过 GET 请求访问 URL/_all_dbs可以查询 CouchDB 中所有的数据库名称。该请求返回的是一个 JSON 数组,其中每个元素表示一个数据库名称。
  • * 通过 GET 请求访问 URL/databasename/可以查询名为databasename的数据库的具体信息。该请求返回的是一个 JSON 对象。
  • * 通过 PUT 请求访问 URL/databasename/可以创建名为databasename的数据库。如果数据库创建成功的话,返回 HTTP 状态代码 201 ;如果已有一个同名数据库的话,返回 HTTP 状态代码 412 。
  • * 通过 DELETE 请求访问 URL/databasename/可以删除名为databasename的数据库。如果数据库删除成功的话,返回 HTTP 状态代码 200 ;如果数据库不存在,返回 HTTP 状态代码 404 。

文档 REST API
文档 REST API 用来查询、创建、更新和删除文档。具体的用法如下:

  • * 通过 GET 请求访问 URL/databasename/doc_id可以获取名称为databasename的数据库中 ID 为doc_id文档的内容。文档的内容是一个 JSON 对象,其中以“ _ ”作为前缀的顶层字段是由 CouchDB 保留使用的,如_id和_rev。
  • * 通过 PUT 请求访问 URL/databasename/doc_id可以在名称为databasename的数据库中创建 ID 为doc_id的文档。通过 POST 请求访问 URL/databasename/也可以创建新文档,不过是由 CouchDB 来生成文档的 ID 。
  • * 通过 PUT 请求访问 URL/databasename/doc_id可以更新已有的文档。在 PUT 请求内容的文档中需要包含_rev字段,表示文档的修订版本号。 CouchDB 使用该字段来做更新时的冲突检测。如果该字段的值与 CouchDB 中保存的该文档的修订版本号一致,则表明没有冲突,可以进行更新。当更新完成之后,返回 HTTP 状态代码 201 ;否则返回 HTTP 状态代码 409,表示有版本冲突。
  • * 通过 DELETE 请求访问 URL/databasename/doc_id?rev=rev_id可以删除数据库databasename中 ID 为doc_id,并且修订版本号为rev_id的文档。

视图 REST API

>>> 阅读全文

 

, , , ,

JSON简介

文章评价:
虽然 XML 已在不少应用程序中大显身手,但它并不是十全十美的,特别是遇到 AJAX 应用的时候,XMLHttpRequest 会检查返回数据的 MIME 类型,如果是 text/xml 类型,XMLHttpRequest 就会运行 XML Parser 来解析返回的文档,并在内存中构建出对应的 DOM 树,之后,你可以用 JavaScript 标准的 DOM 方法来操作 DOM 树。由于众所周知 DOM 的诟病,这显然不是有效率的方法。另外一个问题是,如果你想使用 JavaScript 对象而不是直接用 XM L数据的话,你还得自己遍历整个 DOM 树来创建相应对象。

于是 JSON 出现在我们面前。

JSON 提供了一种更适合 AJAX 应用的标准数据交换格式。JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。

XML 和 JSON 都利用结构化来标记数据。我们将通过一个地址簿的例子来展示它们之间的不同。

该地址簿用XML如下表示:

>>> 阅读全文

 

, , , ,

面向文档的数据库 CouchDB (一) 概述与安装

文章评价:
Apache CouchDB 是一个面向文档的数据库管理系统。它提供以 JSON 作为数据格式的 REST 接口来对其进行操作,并可以通过视图来操纵文档的组织和呈现。 CouchDB 是 Apache 基金会的顶级开源项目。本文将介绍 CouchDB 的基本概念,包括文档、视图,REST API,并通过一个实际的图书点评网站来说明如何用 CouchDB 开发 Web 应用。

CouchDB 介绍

CouchDB 是一个文档型数据库服务器。与现在流行的关系数据库服务器不同,CouchDB 是围绕一系列语义上自包含的文档而组织的。 CouchDB 中的文档是没有模式的(schema free),也就是说并不要求文档具有某种特定的结构。 CouchDB 的这种特性使得相对于传统的关系数据库而言,有自己的适用范围。一般来说,围绕文档来构建的应用都比较适合使用 CouchDB 作为其后台存储。 CouchDB 强调其中所存储的文档,在语义上是自包含的。这种面向文档的设计思路,更贴近很多应用的问题域的真实情况。对于这类应用,使用 CouchDB 的文档来进行建模,会更加自然和简单。与此同时,CouchDB 也提供基于 MapReduce 编程模型的视图来对文档进行查询,可以提供类似于关系数据库中 SQL 语句的能力。 CouchDB 对于很多应用来说,提供了关系数据库之外的更好的选择。下面介绍 CouchDB 中的一些重要概念。

基本概念

文档(document): 文档是 CouchDB 中的核心概念。一个 CouchDB 数据库实际上是一系列文档的集合,而这些文档之间并不存在层次结构。每个文档都是自包含的数据单元,是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。每个文档都有一个全局惟一的标识符(ID)以及一个修订版本号(revision number)。 ID 用来惟一标识一个文档,而修订版本号则用来实现多版本并发控制(Multiversion concurrency control,MVVC)。在 CouchDB 中,文档是以 JSON 对象的形式保存的。

>>> 阅读全文

 

, , , , , ,