Electronic Joint Business

Solution for E-Business

mongodb

基于物联网和 Azure 云的 “Gilt” 网站产品分析

本文的设计构想源自一次自我挑战:我想利用物联网和 Azure 平台做点有趣的东西。该设计的出发点之一,就是充分利用当前的成熟技术如 Azure 云,并以解耦的方式实现物联。稍后你将看到,本文所构建的模型的整体实现都是是以高度松耦合的组件来设计的。1

该设计围绕着 Gilt 电商平台,该站点以优惠价销售包括男装、女装、童装等各类产品。它还提供了开发者 API ,当然少不了要注册帐号以获得应用授权。由于 Gilt 提供了简单优雅的 REST API,可以很容易地创建应用以获得各种产品信息,进而实现产品分析。

相关技术
该设计基于微软的 Azure 云技术,这里列出了所用到的 Azure 服务。

  • Azure Scheduler: 针对每个产品目录都会创建一个 Azure Scheduler,以触发对当天产品的分析.
  • Azure Worker: 用以处理长时间运行的任务以收集 Gilt 产品信息
  • Azure 移动服务平台或 Website:基于 Azure 的移动服务或 website,用以按目录或时间显示所有的产品。它包含两个主要的 Azure worker ,一个用以处理 Event Hub 消息,另一个从服务总线队列(Service Bus Queue)接受消息,并将 Gilt 产品信息导入到 Azure 表存储(Azure table storage)中。
  • Pusher: 用来推送通知,如用户设定的某价格区间内的产品。我们将使用 Pusher 客户端,它可以订阅 Azure Scheduler 发布的频道和事件。
  • 机器学习:我们将借助机器学习来分析不同目录的产品信息
  • MongoDB: Azure 市场服务现在也提供 MongoLabs 的 MongoDB,我们用它来处理数据分类汇总
  • 事件集线器和服务总线队列:我们用到了 Azure 的事件集线器和服务总线队列,因此在模型 2 中 Raspberry PI 上运行的 Gilt 应用收集 Gilt 产品信息并将分类汇总的 Gilt 产品信息提交给事件集线器。从而 Azure worker 针对事件集线器的消息进行处理并将处理过的消息发送给服务总线队列。

在模型 2中我们用到了事件集线器,这与我建立的第一个模型有所不同。稍后你可通过例子了解它是如何工作的。

物联网
这里用到的组件有 Raspberry PI、Arduino 和 GSM Modem。Raspberry PI 和 Arduino 之间通过 USB 转串口的接口互相连接。我们还用到了 GSM 板卡 SIM900,该板卡可以组装在 Arduino 上。

>>> 阅读全文

 

, , , ,

使用Azure和CloundDrive运行MongoDB

Running MongoDb on Microsoft Windows Azure with CloudDrive
I’ve been playing around with the whole CQRS approach and think MongoDb works really well for the query side of things. I also figured it was time I tried Azure so I had a look round the web to see if there we’re instructions on how to run MongoDb on Microsoft’s Azure cloud. It turned out there were only a few mentions of it or a general approach that should work but no detailed instructions on how to do it. So, I figured I’d give it a go and for a total-Azure-newbie it didn’t turn out to be too difficult.

Obviously you’ll need an Azure account which you may get with MSDN or you can sign-up for their ‘free’ account which has a limited number of hours included before you have to start paying. One thing to be REALLY careful of though – just deploying an app to Azure starts the clock running and leaving it deployed but turned off counts as hours so be sure to delete any experimental deployments you make after trying things out!!

First of all though it’s important to understand where MongoDb would fit with Azure. Each web or worker role runs as a virtual machine which has an amount of local storage included depending on the size of the VM, currently the four pre-defined VMs are:

•Small: 1 core processor, 1.7GB RAM, 250GB hard disk
•Medium: 2 core processors, 3.5GB RAM, 500GB hard disk
•Large: 4 core processors, 7GB RAM, 1000GB hard disk
•Extra Large: 8 core processors, 15GB RAM, 2000GB hard disk
This local storage is only temporary though and while it can be used for processing by the role instance running it isn’t available to any others and when the instance is moved, upgraded or recycled then it is lost forever (as in, gone for good).

For permanent storage Azure offers SQL-type databases (which we’re not interested in), Table storage (which would be an alternative to MongoDb but harder to query and with more limitations) and Blob storage.

>>> 阅读全文

 

, ,

MongoDB 开发手册 (二) 连接串和mongo操作台概述

数据库连接
MongoDB是数据库服务器,它可以在前台或者后台运行并等待用户连接。因此,当你启动MongoDB的时候,你会看到这样的字句:

~/$ ./mongod
#
# some logging output
#
Tue Mar  9 11:15:43 waiting for connections on port 27017
Tue Mar  9 11:15:43 web admin interface listening on port 28017

这时屏幕会暂停输出,但并未死机,它会在27017端口上侦听用户的连接。一旦用户连接上数据库并开始发送命令,它又会再次记录它所做的一切。任何一款MongoDB驱动或者Mongo操作台都可以用来连接数据库。

不能通过在浏览器输入”http://localhost:27017″来连接MongoDB,数据库不能通过27017端口上的HTTP协议来存取。

标准连接串格式
这儿介绍的URI schema不一定为所有的驱动程序所支持,你可以参考相关的驱动程序文档以获知该驱动支持多少种标准连接URI。所有的驱动都支持某种指定连接格式的替代方式,如果该格式不被支持。

mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/database]
  • mongodb://是必选的前缀,表明该字串是标准的连接格式
  • username:password@是可选项,如果指定了该项,驱动程序在连接数据库服务器之后,尝试用它连接数据库。
  • host1是URI中唯一的必选项,表明所连接的服务器地址。
  • :portX是可选项,未指定的话默认为27017。
  • /database是要登录的数据库名称,只有指定了username:password@之后,该项才有意义,如果未指定,默认将连接到”admin”数据库。

你可以在URI中指定多个主机连以便连接到同步复制对或同步复制集(replica pairs/sets). 下面是一些例子:

>>> 阅读全文

 

, , , ,

MongoDB 开发手册 (一) 快速上手

获得数据库连接
现在我们用MongoDB提供的Shell来操作数据库。(如果有一个合适的驱动程序,我们可以用任何语言进行同样的操作)。这个Shell很适合交互和管理使用。
下面的命令会启动MongoDB的Javascript Shell:

$ bin/mongo

默认地,Shell会连接到本地数据库”test”,所以你可以看到:

MongoDB shell version: <whatever>
url: test
connecting to: test
type "help" for help
>

“connecting to:” 指明当前Shell正在使用的数据库名称。你可以输入下面的命令来切换数据库:

> use mydb
switched to db mydb

输入help,可以看到所有的交互命令。

如果你有其他数据库的开发经验,那么你可能会注意到,在上面的例子中,我们没有创建数据库或者集合,MongoDB不要求这么做。一旦你插入数据,MongoDB会创建底层的集合和数据库。如果你查询一个并不存在的集合,那么MongoDB会将之视为空集合处理。用“use”命令切换数据库并不会马上创建数据库 – 数据库会延迟到第一次插入数据的时候才创建。所以如果你初次使用一个数据库,”show dbs”并不会显示出该数据库直到你插入些数据。

>>> 阅读全文

 

详解MongoDB的DBRefs

比方说,有个内容丰富的站点,它囊括了诸如 blog ,图片之类的内容,也有日程安排, 文章引用的等等东西。这样许许多多截然不同的内容而且他们彼此之间又没有什么共性:blog 有标题和文本,图片有图片链接和缩略图, 文章引用有引文和作者的名字等等。它们的唯一共性就是站点上所有的东西被存储在不同的 MongoDB 集合中,而且都有一个属性 _Id。

现在有个需求,要求用户可以针对这个网站的所有内容都可以发表评论,也就是说,每个人都可以任选站点的任意内容评头论足一番。如果所有的东西都存储在 MySQL 或者其他关系数据库中,我们可能这样设计:我们可以给不同的数据表都添加上一栏comments:blogpost_comments,picture_comments等等。我们也可以选用另一个方法,创建一个新的数据表comments,并存储评论的内容的id和类型type。这样查询起评论就满简单的:

SELECT * FROM comments WHERE type = ‘picture’ AND object_id = 123

第二种方法和 DBRef 的工作方式类似,即利用类型 type 和 id。你可以参考这篇 文章。DBRef 的格式如下

{ $ref :<collname>, $id :<idvalue>; [, $db :<dbname>; ] }

正如你所见的,$ref有个参数 collection name,就是上面的 type。而 $id,当然就是 id 了。(这儿有个字段:$db,不过当我们只有一个 MongoDB 数据库时,它就没什么用处了)。用 MongoDB 我们这样来存储 comments表:

{
author: "John Doe",
text: "Oh, such a great picture",
object: { $ref: "pictures", $id: ObjectID("4b0552b0f0da7d1eb6f126a1") }
}

这就是全部。

>>> 阅读全文

 

, , ,