個人的に作っているアプリで簡単にリアルタイムにデータが同期される機構を組み込みたく調べていたところ、Firebaseにたどり着いたのでまずはざっくり概要をまとめました。

Firebaseとは

Googleが運営しているMBaasです。
Firebaseの特徴としては、他のMBaasと同じ様に、オンラインでサインアップするだけで、オンラインのデータベースにデータを保存 / 取得ができることに加え、
HTML / CSS / JS / 画像などの静的ファイルをホスティングし、CDNを通じSSLで提供するとこまでを提供するFirebaseHostingやユーザーの行動を分析するFirebase Analyticsなど、Googleさまさま(?)な強力な機能も利用することができます。

Firebaseの機能一覧

サービス 概要 対応プラットフォーム
Firebase Cloud Messaging さまざまなプラットフォームでメッセージを確実に送受信 iOS / Android / C++ / Web
Firebase Authentication 強固な認証によりユーザーの作業を軽減 iOS / Android / C++ / Web
Firebase Realtime Database アプリデータの保存と同期をリアルタイムで iOS / Android / Web
Firebase Strage ファイルを簡単に保存 iOS / Android / Web
Firebase Hosting ウェブ コンテンツをすばやく配信 Web
Firebase Remote Config アプリのアップデートを公開しなくても、アプリの動作と外観を変更 iOS / Android
Firebase Test Lab for Android Google データセンターでホストされている端末上でアプリをテスト Android
Firebase Crash Reporting アプリで発生した問題の診断と修正に役立つ、すぐに使用できる包括的な情報を提供 iOS / Android

Firebase Realtime Databaseとは

データを保存して NoSQL クラウド データベースと同期できます。データはすべてのクライアントにわたってリアルタイムで同期され、アプリがオフラインになっても、利用可能な状態を保ちます。

公式ドキュメントから引用

ほうほう…

主な機能

機能 概要
リアルタイム データが変更されるたびに、接続されているあらゆるデバイスがその更新を数ミリ秒以内に受信します
オフライン Firebase アプリはオフラインでも応答できる状態を保ちます。
クライアント端末からアクセス可能 モバイル端末やウェブブラウザから直接アクセスできます。アプリケーション サーバーは必要ありません。

公式ドキュメントから抜粋

リアルタイムにDBを同期し、オフラインになっても接続が確立したら、現在のサーバーの状態と同期し、アプリケーションサーバを立てることなく、皆様お持ちのモバイル端末やウェブブラウザからアクセスできると。。。!

(上記の概要をそのまま繋げただけとか言わないで。)

DB自体というよりかはその周りを取り巻く通信系の部分もマルッとパッケージングされてるみたいですね。

詳細

  • NoSQL データベース。
  • データはローカルで永続化され、オフラインでも、リアルタイム イベントは引き続き発生。
  • デバイスが接続を回復すると、Realtime Database はローカルデータの変更内容をクライアントがオフラインであったときに発生したリモート更新と同期して、競合があれば自動的に統合。
  • Realtime Database API は短時間で実行できる操作だけを許可するように設計されている。
  • Firebase Realtime Database Security Rules という柔軟性に優れた式ベースのルール言語が用意されており、この言語で、データの構造と、データの読み取りや書き込みを可能にするタイミングを定義。

公式ドキュメントから引用

ざっくり図にした
realtime database.001.jpeg

・ NoSQL データベース。

まず、NoSQLデータベース(データ構造はJSONツリー)ということで、これまで、MysqlやMariaDB(ほぼ同じw)しか触ってこなかった自分にとっては、あまり馴染みのないデータアーキテクチャです。

データベース設計は、RDBの様に正規化をするのではなく、平坦化(非正規化)するのが重要らしい。※このあたりは次回まとめます。

・データはローカルで永続化され、オフラインでも、リアルタイム イベントは引き続き発生。

図で言うオレンジ部分ですかね。
基本的には、ユーザはローカルにあるクラウド上のFirebase Realtime Databaseのコピーに対して操作を行うので、もちろんオフライン時でもイベント自体は引き続き発生しますよと言うことなんでしょうか。なるほど。。。

デバイスが接続を回復すると、Realtime Database はローカルデータの変更内容をクライアントがオフラインであったときに発生したリモート更新と同期して、競合があれば自動的に統合。

図で言うブルーの部分かと。
ローカルでの出来事は、オンライン時は常にクラウド上にあるDBと統合してると。つまりMr. Aがデータを書き加えた場合、Mr. Aのローカルのコピーが変わり、即時にクラウド上のマスターにその差分が統合され、Mr. BやMr. Cのローカルのコピーはその瞬間にマスターとの差分が発生するので、即時マスターとの整合性を取るという流れでしょうか。

Firebase Realtime Database Security Rules という柔軟性に優れた式ベースのルール言語が用意されており、この言語で、データの構造と、データの読み取りや書き込みを可能にするタイミングを定義。

もちろんのことながら、読み書きのルールも設定できるのでセキュアですよ。

ざっくり個人的な感想としては、

・ NoSQLなので、データベース設計はちょっとコツがいりそう。
・ ローカルにコピーを作ることで、オフライン時でも操作ができ、かつオンライン時にローカルのコピーとマスターの整合性を保つという仕組みに「おーなるほど。」となりましたw
・ NoSQLでどこまで複雑なことができるかわかりませんが、簡単なチャットなどの扱うデータの要素(種類?)が比較的少ないアプリでかつリアルタイム性を重視したアプリを作成するケースにベストマッチしているのではないでしょうか。(= 相性が良いアプリとそうでないアプリがある)

以前、Firebaseのチュートリアルの様なものをやって見て、「おーこんな簡単にリアルタイムチャットアプリできんのか」と感動したのですが、いまいち仕組みがわからずモヤモヤしたので、
今回まとめて見ました。

次回は、実際にコードも交えての実践編を書きたいと思います。

Realtime databaseを使ってこんなアプリを作ってみました。
Firebaseを使ってリアルタイムにみんなでyoutubeを視聴するwebアプリを作ってみた

参考資料

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.