GAE開発の落とし穴
Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します
ブックマークされました!
ブックマークがエラーになりました。もう一度お願いします。
作者 Michael Hunger , 翻訳者 渡嘉敷 満理子 投稿日 2010年4月18日
3月25日にMongoDB("humongous"より)1.4がリリースされた直後に、そのクリエータであるDwight Merriman氏(DoubleClickの前CEOおよびCTO)は、10gen(オープンソースのドキュメント・データベースを支援する企業)が、この製品の商用のトレーニングおよびサポートを提供する予定であることを発表した。
InfoQはこの機会を利用し、MongoDBについて、またその機能、適用範囲、NoSQLデータベースのコミュニティにおける立場についてMerriman氏に話を聞いた。Merriman氏の回答は、本記事の該当セクションで引用している。
MongoDBは、スケーラブルでハイパフォーマンスな次世代データベースです。MongoDBのデータはドキュメントとして1つのデータ・オブジェクト内にすべて格納されます。これにより、複雑なリレーションシップを表すことができます。ドキュメントは、プリミティブ型の個別のフィールド("埋め込みドキュメント")、またはドキュメントの配列で構成されます。
このように、フレキシブルな構造になっているため、開発者は、別テーブルへのデータ分割に依存せずに、問題のほとんどの部分をフレキシブルかつ処理しやすい方法でモデル化できます。1つのドキュメントとしてデータのモデル化が最適に行われていない場合、MongoDBには、ドキュメント内のフィールドから別のドキュメントへのポインタを意味する、"DBRef"というコンセプトがあります。
MongoDBデータベースからのデータの取得やクエリは、フレキシブルに行えます。メインのドキュメントをベースに、ドキュメント内のあらゆるフィールド、埋め込みドキュメント、または配列内のドキュメントを動的にクエリできます。埋め込みドキュメントを指定するには、ドット表記を使用します。
MongoDBはC++で記述されており、以下のような機能がある。
MongoDBの目的について、ブログでは次のように述べられている。
問題のごく一部に対するニッチなデータベースを目的として、MongoDBを設計したわけではありません。MongoDBは、開発者コミュニティの大部分における実世界の多くの問題を解決する新しいタイプのデータベースです。
MongoDBプロジェクトの目的は、スケーラビリティの高さ、パフォーマンス、開発のしやすさなど、非リレーショナル・モデルの最も優れた特徴を、従来のデータベース(主要なオペレーショナル・データストアでは有用)では一般的である、重要な機能を用いて組み合わせることです。
MongoDBはラボで設計されたものではありません。われわれは、規模が大きく、可用性も高く、堅牢なシステムを構築した経験に基づいてMongoDBを作成しました。
MongoDBは16カ月前の2009年11月2日に、まず一般に向けてリリースされた。背景にある設計理念では、「スケーラビリティやパフォーマンスを優先し、トランザクションのセマンティックスは緩和されているものの、広く導入してもらい普及させるには、単なる純粋なキーバリュー・ストアではなく、もっと機能を充実させる必要がある」と説明している。
ドキュメント・パラダイムは、複雑なオブジェクト構造の永続化に向けた興味深いアプローチである。特に、ドメイン駆動設計(DDD)が提案する集約は、他のエンティティからのリンクが可能なのはルート・エンティティに限られており、依存するエンティティと値は、ルートを介してのみアクセス可能となっている。MongoDBベースのリポジトリであれば、DDDに基づくプロジェクトで永続性を実現するためのシンプルなアプローチが可能となる。関連する別の考え方に、ビジネス・ドメインは、ビジネス・エンティティと関連している場合には、ドキュメントについて表わすことが多いという事実関係がある。このため、ドキュメントを表記として内部的に使用すれば、他のデータ構造やオブジェクトそのものを使用するよりも、優れた適合性を実現できる可能性もある。
さらに、スキーマレスなドキュメント・データベースの場合、データ・モデリングは、いっそう重要となる。ドキュメントを作成する前に慎重に検討すべきリレーションシップの側面がいくつか存在し、これを行わないと、データの重複やパフォーマンスの劣化などの問題を引き起こすことになる。
たとえば、メイン記事、コメント、コメントへの投票を含むブログの投稿では、リレーショナル・データベースの場合、複数のテーブルに分割されることになります。MongoDBでは、ブログの投稿は、メイン記事のドキュメント内にコメントや投票をドキュメントの配列として含む1つのドキュメントとして表わすことができます。このアプローチを使用すると、データを処理しやすくなり、従来のリレーショナル・データベースでは、パフォーマンスや水平方向に拡張する際の妨げとなっていたJOIN処理の必要性が軽減されます。
> db.blogposts.save({ title : "My First Post", author: {name : "Jane", id :1},
comments : [{ by: "Abe", text: "First" },
{ by : "Ada", text : "Good post" }]
})
> db.blogposts.find( { "author.name" : "Jane" } )
> db.blogposts.findOne({ title : "My First Post", "author.name": "Jane",
comments : [{ by: "Abe", text: "First" },
{ by : "Ada", text : "Good post" } ]
})
> db.blogposts.find( { "comments.by" : "Ada" } )
> db.blogposts.ensureIndex( { "comments.by" : 1 } );
このサンプルは、対話的なMongoDB web console shellで直接試すことができ、オンラインのチュートリアルも組み込まれている。
InfoQのCTOであるAlex Popescu氏が運営するサイト、myNoSQLには、NoSQLデータストア(MongoDBなど)に関するニュース、レビュー、比較などが数多くあり、その一例として、プロダクション・ノートを手掛けている。
Teach Me To Codeでは、MongoDBのさまざまな側面を紹介する3つのスクリーンキャストが公開されている。
Pivotallabsでは、10genのMichael Dirolf氏による導入用のプレゼンテーションが動画および音声バージョンで提供されている。Kyle Banker氏がMongoDBに関して全体的な見解を述べたプレゼンテーションも、slideshareで閲覧できる。
MongoDBは、GNU AGPL v3.0ライセンスで公開されており、mongodb.org内のドライバのライセンスには、Apache License v2.0が採用されている。C++のソースコードは、githubから入手でき、どのオペレーティング・システムでもビルド可能だ。
また、Linux、MacOS X、Windows、およびSolaris用のバイナリ・パッケージとしてインストールすることもできる。
MongoDB自体は、mongodデーモン・プロセス(コア・データベース・サーバ)として実行され、これに各種ドライバがアクセスする。Shardingのサポートとデータベース・ルーティングは、mongosサービスが提供する。
ほぼすべてのプログラミング言語においてMongoDBがサポートされるよう、統合に取り組んでおり、C、C++、C# & .NET、ColdFusion、Erlang、Factor、Java、Javascript、PHP、Python、Ruby、Perl 、その他多くのドライバが利用できる。
MongoDBは、gremlin(グラフ・データベースのライブラリ)のコネクタ・ライブラリである"blueprints"など、他のフレームワークでもサポートされている。
また、スケーラブルなアクター・フレームワークAkkaで利用可能な永続化モジュールの一つとして、Debasish Ghosh氏によって統合された。
運用上、MongoDBはアプリケーションのニーズに応じて、2つのモードで実行できます。1つは、'single master'モードで、1つのsingle masterサーバがすべての書き込みを行います。読み込みは、このデータベースから行うか、読み込みのスケーラビリティを考慮して、任意の数の読み込みスレーブからも実行できます(Sourceforgeの使用事例)。
データ量や書き込みの頻度が非常に多く、single masterで処理するのが難しいアプリケーションの場合は、MongoDBのauto-shardingモード(現時点ではalpha版)を利用できます。このモードでは、任意の数の'shard'(shardとは、単純に1つ以上のMongoDBサーバの集まり)の間で、書き込みが自動的に分散されます。各サーバは、データセットの一部の読み書きを担当します。
いずれの場合も、MongoDBは'強固な一貫性'のアプローチを取ります(MongoDBはCAP定理におけるC-Pシステムと考えられます)。データを複数のMongoDBノードにレプリケートすることによって、高可用性を実現しています。そのいずれも、ある時点でshard内のマスタとしての役割を果たすことがあり、MongoDBはこれを自動的にフェイルオーバします。 このアプローチにより、極めて書き込みに対する高度な可用性を常に維持しつつ、強固な一貫性という多くの使用事例にとって重要な特性がもたらされます。
mongodbのサイトには、管理者向けの情報があり、運用上の要件をサポートする以下のような項目がある。
MongoDBのドキュメンテーションは、mongodb.org wikiから、クリエイティブ・コモンズ・ライセンスで利用できる(PDF版はこちら)。
10genは、アプリケーション開発コミュニティの多くに対し、実世界の問題を解決するためにMongoDBを設計してきました。その意味では(さらに、お客様の導入事例からも明らかなように)、MongoDBはデータベース支援型アプリケーションの多くにとって、データストレージに向けたアプローチになると考えています。
現在10genでは、製品アプリケーションにてMongoDBを使用するお客様を対象に、サポート、コンサルティング、トレーニングを提供しています。近い将来、クラウドベースのサービス(MongoDBのサービスがホストするような)や、大規模なMongoDBクラスタ用の高度な管理ツールも10genから提供する予定です。
MongoDBは、バージョン1.3から頻繁にプロダクション環境で使用されている。データストアの適応事例で著名なものを以下に示す。
もちろん、ドキュメントストアの使用事例は、この他にもたくさんある。
MongoDBチームは、データストアに関して非常に幅広いビジョンを持っている。彼らは、対象とする機能の約半分を最新の1.4リリースに取り入れることを検討しており、来年取りかかる予定だ。
【ネクストスケープ】.NET、C#のアプリケーション開発者募集
世界の先進エンジニアが集結 - QCon TOKYO 2012 早期割引実施中!
Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します
去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続き開 催されていく予定である。本記事では、開催の様子をレポートする。
Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。
GoogleはVMをともなう新しい言語であり、JSコンパイラでもあるDartをプレビューした。 InfoQはDartのアプリの構築に貢献する文法の裏側を探った:スナップショット、Isolate、モジュール方式
本記事ではCSPベースの「マルチドメイン・モデル検査ツール」である、PAT(Process Analysis Toolkit)について紹介する。モデル検査は、形式手法(Formal Method)という方法論を基礎とする技術であり、複雑さが増大しながらも安全性を求められる、現在のソフトウェア開発の状況に対する処方箋の1つとして注目されている手法である。
前回まで、Jenkinsの幾つかの側面に注目して解説をしてきました。シリーズ最後の今回は、Jenkinsをサービスとして使う方法を紹介します。
Alloyは、MITにて開発された仕様記述言語であり、ツールによる自動解析を使い、インクリメンタルに形式仕様が書けることが特長である。筆者らはAlloy開発者による、Alloyを使った形式手法入門書を翻訳、今夏にオーム社より刊行した。本記事では、Alloyの簡単な概要と、翻訳書『抽象によるソフトウェア設計』(「Alloy本」)を紹介する。
スマートフォンを中心としたマルチデバイスにおけるタッチユーザーインターフェイスへの対応は、既に必須の項目となりつつある。本記事では、Windows デバイスにおける UX のベースとなっている「メトロ」というデザイン言語を掘り下げながら、既存環境を意識しつつもどのようにタッチユーザーインターフェイス開発に取り組んでいくべきであるかについて解説していく。
No comments
スレッド表示 返信