1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

P2Pメッシュネットワーク + 自動同期『Ditto』

Posted at

公式ドキュメント

詳細や最新情報は、公式ドキュメントを確認: https://docs.ditto.live
Ditto企業サイトはこちら: https://www.ditto.com

Dittoとは

  • 米国Ditto社のソフトウェア
  • 中央サーバー・DB無し
  • サーバー依存なしの分散型DBがモバイルで!
  • 端末間でデータ自動同期
  • 端末のアプリに入れるSDK + クラウドプラットフォーム(認証、長期データ保存など)
  • アプリをLAN、Wi-Fi Aware、Bluetooth LEなどでP2P接続
    • 接続経路を自動切り替え
    • Bluetooth LEだと障害物がなければ80mぐらい届く
      • データをリレーできるので、端末が多ければ距離は無限
  • データ衝突しないデータ方式(CRDT
  • 直接繋がってなくてもデータを 中継(リレー) できる
  • 誰とも繋がってなくてもローカルに保持 → 再接続で自動同期
  • マルチプラットフォーム(それぞれに自動対応)
    • iOS、Android、Windows、Mac、Linux、Raspberry Pi...などなど

何が嬉しいの?

  • 依存が減って、障害ポイントが少なくなる
    • 全体の安定性が向上
  • ネットワークの問題を 「アプリのアップデートだけ」で解決 → 機器追加よりコストが安い
  • 自社開発では実現が難しい体験

どんな感じの使い方?

基本的な流れは以下の通り (詳細は公式ドキュメント参照)

初期化

ditto = Ditto(<認証情報>)
// メッシュに参加 + データ同期開始
try ditto.startSync()

受信したいデータのクエリを登録(配布)

// 他の端末に対してクエリを配布し、受け取りたいデータの種類を伝えておく。
// 更新があったら自動的に受信し、ローカルDBが更新される(ポーリングとか更新とかのコードは不要)
ditto.sync.registerSubscription(
  "SELECT * FROM cars WHERE color = :color",
  [ "color": "blue" ]
)

ローカルDBの変更をリアルタイム検知

observer = ditto.store.registerObserver(
  query: "SELECT * FROM cars WHERE color = :color",
  argumets: [ "color": "blue" ]) { result in
    /* `result` にデータ(JSON)が入ってるので、UI更新などに利用 */
};

ローカルDBの更新

// ローカルDBにDocument追加
// 他の端末に送信するなどは不要で、データを必要としている端末があればバックグラウンドで自動で送信
await ditto.store.execute(
  query: "INSERT INTO cars DOCUMENTS (:newCar)",
  arguments: ["newCar": ["color": "blue"]]);

Dittoの面白さ

  1. SDKをインストールするだけで、メッシュ構築!(めっちゃ楽しい)
  2. 勝手に通信経路(LAN、Wi-Fi Aware、Bluetooth LE)が切り替わるのが凄い
  3. ネットが切れやすい場所など、今までアプリが使いづらかった場所でアプリが使える(チャットとか)
    • 人が多い会場、船、飛行機、工場、、、
  4. ネットが切れたり、サーバー障害があるとダメージがでかい場所で万が一に備えて入れたい
    • 災害、病院、飲食店(ランチ時にサーバーとの通信に遅延があるとやばい)
  5. セキュリティ考慮済み(暗号化(TLS1.3))
  6. 自動同期のためサーバーサイドAPIとかも無くて良い
  7. モバイルアプリエンジニアだけでサービス実装可能

Why Ditto?

  • 自前でメッシュ + 自動同期を作るのは難しすぎる
  • ネットが安定してない or 切れるとやばい場所を考えると唯一の選択肢

対応言語・プラットフォーム

  1. Swift
  2. Flutter
  3. React Native
  4. Kotlin
  5. Java
  6. JavaScript Web (ブラウザではBluetooth等は利用不可なのでサーバーとのみ通信可)
  7. Node.js
  8. C#
  9. C++
  10. Rust
    など

利用ケース

  1. 飲食店・小売の店舗システム
    • サーバーの障害、Wi-Fiが不安定になると売上ダメージがでかい
  2. 人が多く4G/5Gが安定しない場所
    • 会場、災害時、遊園地
  3. ネットがそもそも繋がりにくい場所
    • 金属に囲まれた工場
    • 飛行機
    • 工事現場
    • 地下

利用企業 (一部)

クラウド

  • 長期間・大容量のデータ保管
  • 既存クラウドDBとも同期可能
    1. HTTP API
    2. Webhook
    3. Apache Kafka
    4. コネクター(他社DBと自動同期)
  • ネットが復旧したり、1台でもメッシュ内で繋がってる端末があれば、データ中継で全端末がサーバーと同期
  • 認証やデバイス管理
  • データ、デバイス状況の可視化
    など

デモアプリ (ソースコードあり)

チュートリアル

技術問い合わせ (日本語可)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?