kikki's tech note

技術ブログです。UnityやSpine、MS、Javaなど技術色々について解説しています。

Cloud Pub/Subを使って、負荷を低減するWebサーバーを構築する

本章では、Google CloudのPub/Subを利用して、Batchアプリを構築する方法について共有します。

はじめに

Webアプリでは、Front EndのWebサーバーに負荷のかかる処理をさせないことが、高パフォーマンスなサービスの秘訣になります。そのため高負荷の処理は、Back Endのサーバーで行います。
Google CloudのApp Engineでは、サービスを複数準備することで、目的に応じたWebサーバーを構築できます。今回は、Back Endで高負荷の処理を行うWebサーバーを構築し、Front Endからの橋渡しとしてPub/Subを利用します。

Webサーバーの全体構成の概要図を示します。

f:id:kikkisnrdec:20190406142807p:plain
google cloudのインフラ構成例

サンプル

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に指定します。
以下に、設定例を示します。

f:id:kikkisnrdec:20190406151430p:plain
Pub/Sub設定例

筆休め

普段利用するWebサービスで、サーバーからのレスポンスに時間がかかると、ユーザーの離脱率が増えます。Google Cloudでは、Batchサーバーの構築もApp Engineで構築することができるため、インフラ知識がなくとも、簡単に構築できます。

以上、「Cloud Pub/Subを使って、負荷を低減するWebサーバーを構築する」でした。


※無断転載禁止 Copyright (C) kikkisnrdec All Rights Reserved.