読者です 読者をやめる 読者になる 読者になる

Google Cloud Pub/Subを使ったPC-モバイルアプリ間のデータ連携

はじめに

PC <-> モバイルアプリ間のデータ通信にPublish/Subscribeメッセージモデルを利用しています。今はPubNubを使っていますが、スケールや価格を考慮してGoogle Cloud Pub/Subへの移行を検討しています。今回はGoogle Cloud Pub/Subをとりあえず使ってみた時のメモです。

やりたいこと

  1. PC Webのある画面でモバイルアプリからのデータを待ち受ける。(Subscribe)
  2. モバイルアプリからPC Webにデータ連携。(Publish)

※ 今回の内容は、1Publisherに対して、1Subscriberを想定しています。PC Webとモバイル間でTopic情報を連携する必要がありますがこの記事ではその部分は省略します。

Google Cloud Pub/Subの構成

Cloud Pub/Subの構成は以下のようになっていて、Publishする時は、事前に作成したTopicに対してメッセージを送信します。

What is Google Cloud Pub/Sub?

スクリーンショット 2016-01-30 04.41.16.png

とりあえず使ってみましょう

GithubにあるNode.js版のサンプルを元にして説明します。

1. 事前準備

1, Google Developers Consoleを開く

2, プロジェクトを作成、または既存のプロジェクトを選択

3, メニューからAPI Managerを選択して、以下APIを有効にする

4, 認証情報メニューからサービスアカウントキーを作成後、JSONファイルを保存

スクリーンショット 2016-01-30 04.57.28.png

スクリーンショット 2016-01-30 04.58.25.png

5, ローカルPCに適当なディレクトリを作成して、Google Cloud Node.js Clientをインストール

$ npm install --save gcloud

6, 5のディレクトリに認証用JSONファイルを保存

7, 以下のようなディレクトリ構造になります。(subscribe.js, publish.jsについては後述)

pub-sub-sample
  ├── subscribe.js
  ├── publish.js
  ├── sample-project-1234567890.json
  ├── node_modules
       └── gcloud

2. subscribe.jsを実装

subscribe.jsでは以下を処理します。

  1. Topic作成
  2. Subscribe
  3. データ受信後ログに表示
  4. Topic削除
  5. データ受信リスナー削除
var gcloud = require('gcloud');

var pubsub = gcloud.pubsub({
  projectId: 'sample-project',
  keyFilename: '/tmp/sample-project-1234567890.json'
});

// Create Topic
pubsub.createTopic('info', function(err, topic, apiResponse) {

  // Error check e.g. Authentication Check
  if (err) {
    console.log(err);
    return;
  }

  // Subscribe
  pubsub.subscribe(topic.id, topic.id, {
    interval: 1
  }, function(err, subscription, apiResponse) {

    subscription.on('error', function(err) {
      console.log('err');
    });

    // onMessage Callback
    function onMessage(message) {
      console.log(message.data);
      console.log(message.attributes);

      // Remove Listener
      subscription.removeListener('message', onMessage);

      // Delete topic
      topic.delete(function(err, apiResponse) {
          console.log(topic.id + " is deleted");
      });
    }

    // Add Listener
    subscription.on('message', onMessage);
  });

});

3. publish.jsを実装

publish.jsでは以下を処理します。

  1. Publish
var gcloud = require('gcloud');

var pubsub = gcloud.pubsub({
  projectId: 'sample-project',
  keyFilename: '/tmp/sample-project-1234567890.json'
});

var registerMessage = {
  data: {
    userId: 3,
    name: 'Stephen',
    event: 'new user'
  },
  attributes: {
    key: 'value',
    hello: 'world'
  }
};

// Publish
var topic = pubsub.topic('info');
topic.publish(registerMessage, function(err) {
  if (err) {
    console.log(err);
  }
});

4. 実行

Terminalの画面を2画面用意して実行します。

4-1. Terminal1(PC Web)

$ node subscribe.js

4-2. Terminal2(モバイルアプリ)

$ node publish.js

4-3. Terminal1(PC Web)

Publishした結果が表示されます

$ node subscribe.js
{ userId: 3, name: 'Stephen', event: 'new user' }
{ hello: 'world', key: 'value' }
info is deleted

まとめ

なんとなく動くことは確認しました。次回はPubNubで懸念だった以下の件を確認する予定です。

  • モバイルアプリからのPublish (Swift)
  • 3G回線などのコネクション状態が悪い場合のエラーハンドリング。

参考

What is Google Cloud Pub/Sub?

Google Cloud Client Library for Node.js

gcloud-node document

Google Cloud Pub/Sub Node.js Sample: TypeError: Cannot read property 'on' of null

TipMe

TipMe with IndieSquare