スケーリングについて

実際にどのようなサーバー構成で運用すれば良いのか、実際の運用イメージを踏まえながら解説していきます。

system-overall-view.png

obniz-app-sdkのMaster/Slave機能を使用することで容易にスケーリングすることが可能です。

Masterは各Slaveにobnizを割り振る役割を果たし、Slaveは割り振られたobnizデバイスとコネクションを張ります。

system-scalling.png

MasterとSlaveはRedis(PubSub)を介して通信しており、冗長化を容易に行えます。

⚠Masterは冗長化に対応していません。冗長化可能なのはSlaveとRedisのみです。

obniz-app-sdkを使用したスケーリングの例

前述の通り、スケーリングにはRedisが必要です。

Redisは一般的にインメモリデータベースとして扱われますが、obniz-app-sdkではPubSubとして利用しています。

Ubuntuでは下記のコマンドでインストールすることができます。

$ sudo apt install redis-server

Redisのセットアップが完了したら、obniz-app-sdkのオプションを追加してRedisを使用するようにします。

ローカルにインストールした場合は下記のようになります。

const app = new App({
  appToken: "<<<  ココにTokenが入ります  >>>",
  workerClass: MyWorker,
  instanceType: AppInstanceType.Master, // Slaveの場合はAppInstanceType.Slave
  obnizClass: Obniz,
  database: "redis", // これと
  databaseConfig: "redis://address:6379", // これを追加
})

app.start();

以上で負荷分散が可能になります。

この状態で1台のMasterと複数台のSlaveを起動し、obnizにアプリをインストールすると、自動的に負荷分散されます。また、Slaveを終了すると、そのSlaveに割り当てられていた分は他のSlaveに引き継がれます。

⚠Slaveを増やした場合、その新Slaveには自動的に引き継がれません。アプリインストールを新たに行うと新Slaveにも割り当てられます。

他サービスとの連動方法

SlaveからデータベースやRedisなどを経由してデータを溜め込み、他サービスから参照することなどが可能です。

他にも、直接他サービスへ送信する方法や、Masterに直接組み込む方法などもあります。

system-linking-services.png

obniz-app-sdkはライブラリですので、既存サービスに直接組み込むことも可能です。