本章では、Google CloudのPub/Subを利用して、Batchアプリを構築する方法について共有します。
はじめに
Webアプリでは、Front EndのWebサーバーに負荷のかかる処理をさせないことが、高パフォーマンスなサービスの秘訣になります。そのため高負荷の処理は、Back Endのサーバーで行います。
Google CloudのApp Engineでは、サービスを複数準備することで、目的に応じたWebサーバーを構築できます。今回は、Back Endで高負荷の処理を行うWebサーバーを構築し、Front Endからの橋渡しとしてPub/Subを利用します。
Webサーバーの全体構成の概要図を示します。
サンプル
Pub/Subの構築
まず、Pub/Subをプロジェクト上に構築します。以下のコマンドを実行します。
# PubSubを構築するプロジェクトを指定 $ gcloud config set project 【プロジェクト名】 # トピックを作成 $ gcloud alpha pubsub topics create 【トピック名】 Created topic [projects/【プロジェクト名】/topics/【トピック名】]. # サブスクリプションをトピックに紐づけて作成 $ gcloud alpha pubsub subscriptions create projects/【プロジェクト名】/subscriptions/【サブスクリプション名】 --topic projects/【プロジェクト名】/topics/【トピック名】 Created subscription [projects/【プロジェクト名】/subscriptions/【サブスクリプション名】].
Publisherのサンプル
次に、Front EndからBack Endに送るためのサンプルプログラムです。
import "cloud.google.com/go/pubsub" func HogeHoge() error { ctx := context.Background() proj := os.Getenv("GOOGLE_CLOUD_PROJECT") if proj == "" { _ = p.Env.Log.Critical("GOOGLE_CLOUD_PROJECT environment variable must be set.\n") os.Exit(1) } client, err := pubsub.NewClient(ctx, proj) if err != nil { return err } topic, err := fetchTopic(ctx, client, "【トピック名】") if err != nil { return err } message, err := json.Marshal(【Back Endに送りたいデータ】) if err != nil { return err } topic.Publish(ctx, &pubsub.Message{ Data: []byte(message), }) return nil } func fetchTopic(ctx context.Context, client *pubsub.Client, name string) (*pubsub.Topic, error) { t := client.Topic(name) if ok, err := t.Exists(ctx); err != nil { return nil, err } else if !ok { // トピックがPub/Sub上になければ作成する ct, err := client.CreateTopic(ctx, name) if err != nil { return nil, err } fmt.Printf("Topic created: %v\n", ct) return ct, nil } return t, nil }
Subcriptionの設定
最後に、Back EndでFront Endからのデータを受け取るために、Pub/SubのSubscriptionにBatchサーバーのURLをGoogle CloudのPub/SubのSubscriptionに指定します。
以下に、設定例を示します。