Couchbase Lite機能解説：ピアツーピア同期〜アーキテクチャー構成/ワークフローと実装サンプルコード

## はじめに

Couchbase Liteのピアツーピア同期についての基本を理解していただけるよう、機能概要に加え、ピアツーピアコミュニケーションのアーキテクチャー構成図とワークフロー、および実装のサンプルコードを紹介します。


## 概要
Couchbase Liteのピアツーピア同期ソリューションは、エッジデバイス間におけるデータの双方向の同期を提供します。

Couchbase Liteは、IPベースのネットワークで通信するピアツーピアアプリケーション用に、WebSocketベースのリスナーの実装を提供しています。そのため、わずか数行のコードでピアツーピア同期を実現することができ、アプリケーション開発を簡素化することができます。

Couchbase Liteのピアツーピア同期では、次のことが可能になります。

- デルタ同期のサポートにより、ネットワーク帯域幅の使用を最適化し、データ転送コストを削減する。
- TLS暗号化および認証サポートの組み込みサポートを使用してデータを安全に同期する。
- 組み込みの競合解決サポートを使用して、同時書き込みによるドキュメントの競合管理の複雑さを大幅に軽減する。
- 組み込みのネットワーク復元力を活用する。

なお、Couchbase Liteのピアツーピア同期ソリューションは、クロスプラットフォーム（たとえば、AndroidデバイスとiOSデバイスの同期をサポートします）。

## アーキテクチャー構成
最も基本的なピアツーピア同期では、一方のピアがもう一方のピアのレプリケーターのリスナーとして機能します。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/1a3fde2f-11b1-eb88-ac80-e6fcb8a3e3f7.png)


したがって、アプリケーションでピアツーピア同期を使用するには、リスナーとして機能するようにピアを構成する必要があります。これは、提供されているリスナーAPIを使用して行われ、最も重要なものとして、`URLEndpointListener`と`URLEndpointListenerConfiguration`があります。
これらのビルディングブロックを使用して、開発者はピアツーピア同期をすばやく実装できます。

各リスナーインスタンスは、1つのCouchbase Liteデータベースを担当します。一方、データベースに関連付けることができるリスナーインスタンスの数に制限はありません。



## ワークフロー

1. リスナー（パッシブピア、またはサーバー）を構成します。

2. リスナーを初期化します。リスナーは、（ユーザー定義または自動選択されたポートで）着信WebSocket接続をリッスンします。

3. レプリケーター（アクティブなピア、またはクライアント）を構成します

4. ディスカバリフェーズを（何らかの形で）実現します。これには、NSD（ネットワークサービスディスカバリ）などのプロトコルを使用します。次のURLが参考になります。：https://developer.android.com/training/connect-devices-wirelessly/nsd

5. レプリケーターの接続先をリスナーに向けます

6. レプリケータを初期化します

7. レプリケーターとリスナーは、構成されたセキュリティプロトコル交換を行って接続を確認します

8. 接続が確認されると、レプリケーションが開始され、2つのデータストアが同期されます。


## 実装サンプル
次のサンプルに示すように、わずかなコードでピアツーピア同期を実装できます。

#### リスナー
以下のサンプルコードでは、暗号化されたピアツーピア同期のためのリスナーを準備しています。



```JAVA
final URLEndpointListenerConfiguration thisConfig =　①
  new URLEndpointListenerConfiguration(thisDB); 

thisConfig.setAuthenticator(　②
  new ListenerPasswordAuthenticator(
    (username, password) ->
      username.equals("valid.User") &&
      Arrays.equals(password, valid.password.string)
    )
  ); 

final URLEndpointListener thisListener =　③
  new URLEndpointListener(thisConfig); 

thisListener.start(); ④
```

①リスナー構成を初期化します
②基本認証を要求するようにクライアントオーセンティケーターを構成する
③リスナーを初期化します
④リスナーを起動します

#### レプリケーター
以下のサンプルコードでは、暗号化されたピアツーピア同期のためのレプリケーターを準備しています。


```JAVA
URI uri = null;
try {
    uri = new URI("wss://10.0.2.2:4984/db");　①
} catch (URISyntaxException e) {
    e.printStackTrace();
}
Endpoint theListenerEndpoint = new URLEndpoint(uri); 

ReplicatorConfiguration thisConfig =
  new ReplicatorConfiguration(database, theListenerEndpoint); ②

thisConfig.setAcceptOnlySelfSignedServerCertificate(true); ③

final BasicAuthenticator thisAuth
= new BasicAuthenticator(
    "valid.user",
    "valid.password.string");
thisConfig.setAuthenticator(thisAuth) ④

this.replicator = new Replicator(config); ⑤
this.replicator.start(); ⑥
```

①リスナーのエンドポイントを取得します。ここでは既知のURLを使用していますが、これは検出フェーズで動的に確立されたURLである可能性があります。
②同期するデータベースと同期するリスナーを指定して、レプリケーター構成を初期化します。
③リスナーからの自己署名証明書を期待するようにレプリケーターを構成します
④リスナーが基本認証クレデンシャルを要求した場合にそれらを提示するようにレプリケーターを構成します（クライアント認証はオプションです）
⑤レプリケーターを初期化します
⑥レプリケーターを起動します




## 関連情報

https://docs.couchbase.com/couchbase-lite/3.0/android/p2psync-websocket.html





ピアツーピア同期を実装する方法の詳細を確認するために、以下のチュートリアルを参照することができます。


https://docs.couchbase.com/tutorials/cbl-p2p-sync-websockets/swift/cbl-p2p-sync-websockets.html