Posts Tagged ‘mongodb’

EventStatsはherokuとMongoLabとさくらVPSで動いている

Posted by ReSTARTR - 28/12/11 at 09:12 pm

今月頭にブログ書きましたが、EventStatsという勉強会の参加者の推移が見れるサービスを公開しました。

まぁ自分が欲しかっただけなんですけど、使ってみて頂ければ幸いです。

今回はそのサービスの構成とかについて書いてみます。

アジェンダ

  1. 全体像
  2. システム構成
  3. Gitリポジトリ
  4. MongoDBのPaaS
  5. 各イベント管理サービスAPIの違い
  6. 開発メモ

1.全体像

開発環境も含めて全体像を図にしてみました。(初Cacooですが超べんりですね!)
赤い線がGit操作で、黒い点線がMongoDBへのアクセスです。

全体像

2.システム構成

大きく分けてwebとクローラーの2つです。

webはherokuに、クローラーはさくらのVPSに配置。
まずは優先してデータ蓄積を…ということでクローラーをpythonとmongodbで作成しました。
(サービス的にはやいとこデータためないと意味ないので。)

クローラーは5分おきに起動するのでScalaよりPythonを選択しました。起動コスト重視です。
(Scalaでサクサク開発できる程のスキルではないというのもありますが…)

実行場所はherokuのworkerも考えたましたが、最終的に既に利用していたさくらVPSでcronジョブとして運用することに。
ということでScalaのWebはデータ参照のみで、データの更新はしません。

3.Gitリポジトリ

webとクローラーは分けてGitで管理。リモートリポジトリはどちらもさくらのVPS上においています。
ただし、本番リリースは開発PCからherokuに別途pushします。
※webもさくらVPSにリモートリポジトリを持って、本番データを参照するステージング環境として利用しています。

eventstats-web

eventstats-crawler

4.MongoDBのPaas

herokuプラグインとしてMongoLabMongoHQの2つが提供されています。どちらも無料枠があるのですが、MongoLabの方が無料で利用できる容量が大きいのでこちらを選択。
月額の利用料金は以下です。(括弧内は1MBあたりの金額の目安です)

これ以上の容量も利用可能ですが個人で払う範囲ではないと思い除外してます。

MongoLab

MongoHQ

5.各イベント管理サービスAPIの違い

まずはatnd, zusaar, partake.inの3サービスに対応
それぞれ検索APIを提供してくれているのですが、当然ながら規格とかもないのでリクエストもレスポンスも違いがあります。 データ蓄積する際にそのAPIの差異を吸収して、webアプリから参照する際は気にしなくていい戦略をとりました。

APIの違い検索のみに特化して違いをまとめると以下の通りです。

atnd

イベント数も多いので、このAPIをスタンダードに設定。

zusaar

基本的にはatnd準拠っぽい感じだけど細かい違いがあります。

atndとの違い

partake.in

全然違うAPI。APIリストにあっても未実装がほとんどなので、利用する際はソースを確認したほうが良いです。

今回必要になりそうなAPIは2つくらいでした。

その他の特徴は以下。

上記をふまえ、atnd/zusaarはJSON形式でAPIからデータ取得。
partake.inのみイベントのリストをAPIから取得して、ユーザー数はWebページのスクレイピングで対応しました。

6.開発メモ

web(heroku)からもクローラー(さくらのvps)からも離れた場所にある

開発PC上だと気にならなかったのですが、1件1件findしてinsertやupdateをしていると当然遅いです。なのである程度まとめて一気にinsertする方針に変更しました(ベンチ結果はありません ^^;)。

更新はクローラーの1プロセスからのみ実行されるので、トランザクションとか意識しなくて良いです。なので比較的自由な構成がとれます。

ScalaでJSON API

まずはUnfilteredでJSON APIを作成。けど、jsでjson取得〜チャート生成の実行時間が思いの外大きいので、jsonも1枚のHTMLに埋め込む方針に変更。

さいごに

ざっと書きだすとこんな感じです。まぁこんな構成もあるよ、ってくらいにしか言えませんが。
webとクローラーを分けたことで、開発中のスキーマ変更が柔軟に行えたのは良かったのですが、スキーマ定義を共通で管理していないので、そのあたりうまく管理できると良いなと思ったり。

当初はもう少しwebの機能も多かったのですが、効率化をしているうちにシンプルな形に落ち着きました。Scalaのコードもかなり小規模なものになっています。

イベント管理者の方からのご意見ご要望などいただけると嬉しいです :)

Fork me on GitHub

If you enjoyed this article please consider staying updated via RSS. Links to your own social media pages could be added here.

DotCloudのMongoDBをScalaから使ってみる

Posted by ReSTARTR - 28/05/11 at 08:05 pm

DotCloudにDuoStackが買収されて、DotCloudでもMongoDBが使えるようになりましたし、node.jsも使えるしで、ますますDotCloudが魅力的なものになってきました。 ただし、node.jsはサポートされても、WebSocketは正式サポートされていないと公式マニュアルにも書いてありますがWebSocketサポート済みのDuoStack買収によってどう流れるか気になるところです。

さて今回は、前回作ったものをベースにScalaからMongoDBへアクセスするサンプルをDotCloudで動かすまでを書いておきます。(まぁ、Scalaのコードはオマケみたいなものですけど…)
前回の記事はこちらです。 * ScalaをDotCloudにアップロードするためのsbtサンプル

ちなみにDotCloudは下記バージョンにて動作しているみたいです(2011.05.28現在)

作成したサンプルアプリ

事情により停止する場合があるかもしれませんがご了承を。

DotCloudにMongoDBサーバーを準備する

DotCloudのMongoDBマニュアルはこちら

上記マニュアルにしたがって作成すればMongoDBサーバーを準備できます。
基本的には、追加したいサーバーを登録して、ユーザーを作成するだけです。
簡単。

今回は”example.mongo”という名前で作成する例を記してありますので、
それぞれ自分の作成したいアプリ名に読み替えて下さい。

サーバーを作成

事前に”dotcloud create example”は実行してあるものとします。
詳しくはこちらのマニュアルを見てください。

1
$ dotcloud deploy -t mongo example.mongo
> Created "example.mongo".

DB情報を確認(ID/PASS)

1
$ dotcloud info example.mongo

deployコマンド実行してから実際に作成されるまで少し時間がかかります。
すぐにinfoコマンドを実行すると下記エラーがでます。
※正確に測ってませんが数十秒くらい?

> Sat May 28 08:14:43 Error: couldn't connect to server 127.0.0.1 shell/mongo.js:79
> exception: connect failed
> Connection to mongo.example.dotcloud.com closed.
> Abort.

作成完了していれば、下記情報が表示されますので、”mongodb_password: ******”に記載されたパスワードをメモしておきます。

cluster: wolverine
config:
    mongodb_password: ******
created_at: 1306570413.6722209
name: example.mongo
namespace: example
ports:
-   name: ssh
    url: ssh://mongodb@mongo.example.dotcloud.com:5906
-   name: mongodb
    url: mongodb://root:******@mongo.example.dotcloud.com:5907
state: running
type: mongodb

MongoDBサーバーへログイン

1
$ dotcloud run example.mongo mongo

infoコマンドで表示されたパスワードを使って、”sampledb”というdbにアプリユーザーを追加します。

> use sampledb
switched to db sampledb
> db.getSisterDB("admin").auth("root", "<infoコマンドで表示されるパスワード>");
1
> db.addUser("APPUSER_NAME", "APPPUSER_PASS");
{
     "user" : "APPUSER_NAME",
     "readOnly" : false,
     "pwd" : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
> exit
bye
Connection to mongo.example.dotcloud.com closed.

※とりあえず一旦ログアウトしてますが、別に必須じゃないです。

再度ログインしてテスト操作してみる

1
$ dotcloud run example.mongo mongo

新規作成したユーザーでDB操作が可能か確認してみます。

# mongo
Warning: Permanently added '[mongo.example.dotcloud.com]:5906,[174.129.17.131]:5906' (RSA) > to the list of known hosts.
MongoDB shell version: 1.8.1
connecting to: test
> use sampledb;
switched to db sampledb
> db.auth("sampleuser", "samplepass");
1
> db.sampledb.save({id:1,name:"foo"});  
> db.sampledb.find();
{ "_id" : ObjectId("4de0b033a1fd29eb0e1522fd"), "id" : 1, "name" : "foo" }

問題なさそうなので、あとはアプリを”dotcloud push”して動かすだけです。

scalaからアクセスするサンプル

サービス名を「example.samplemongo”として作成する例です。

requirementsはイカのとおり。

1
sbt

で基本ディレクトリを作成したら、下記プロジェクト設定を{root}/project/build/MongoSampleProject.scala”として保存します。

前回の設定クラスをコピーしてきたので、”sbt dot_create”と”sbt dot_push”も一応使えます。

※”example.mongo”の名称は適宜読み替えでお願いします。

MongodbSampleProject.scala

配置できたら、

1
sbt reload update

でライブラリを読み込みます。

あとは下記Servletの実装とweb.xmlを用意したらOK.

MongodbServlet.scala
web.xml

できたら、”sbt dot_push”でdotcloudへアップロードされるはずです。

最後に、”http://samplemongo.exapmle.dotcloud.com”にアクセスして、フォームからデータ登録ができれば成功です。

RDBMSにくらべてデータ保存・取得までが圧倒的に簡単で、PaaSでもMongoDBはいい感じですね!

If you enjoyed this article please consider staying updated via RSS. Links to your own social media pages could be added here.