Amazon Web Services ブログ

Amazon DynamoDB グローバルテーブルを使用して、高速かつグローバルで利用可能なユーザープロファイリングシステムを作成する方法

ユーザープロファイリングシステムとは、ユーザーの名前、ID、連絡先情報、過去の行動、関心事項、その他の情報を保存するシステムです。こうしたシステムはまた、ユーザー情報を照会する方法も提供します。この記事では、グローバル化されたユーザープロファイリングシステムの重要性、Amazon DynamoDB グローバルテーブルを使用してこのシステムを作成する方法、機械学習でこのシステムを使用する方法について説明します。

概要

ウェブサイト、モバイルアプリケーション、ゲームは、グローバルなユーザーベースを持つことができます。たとえば、最近のトップトレンドゲームである PlayerUnknown の Battlegrounds を考えてみましょう。そのユーザーベースは、以下のような地理的な内訳です。

  • 米国から 24%
  • 中国から 19%
  • ドイツから 6%

このゲームや同様の他のゲームでは、レイテンシーが少なくグローバルに利用可能なユーザープロファイリングシステムが、世界中のユーザーに優れたエクスペリエンスを提供するのに役立ちます。

DynamoDB グローバルテーブルは、複数の AWS リージョンで DynamoDB テーブルを複製することにより、データへの高速なグローバルアクセスを可能にします。DynamoDB グローバルテーブルを使用すると、迅速で一貫性のあるグローバルなユーザープロファイリングシステムを構築できます。この記事で説明しているユーザープロファイリングシステムは、グローバルな低レイテンシーアクセス用のグローバルテーブルのローカルレプリカテーブルを使用し、そのデータには最終的な一貫性があります。

このグローバル化されたユーザープロファイリングシステムは、機械学習目的でも使用できます。DynamoDB はスキーマレスなので、任意の形式のデータを簡単に保存して照会することができます。したがって、DynamoDB ベースのユーザープロファイリングシステムで使用されるデータ形式を、選択した機械学習モデルに最適なデータ形式に調整することができます。この記事では、機械学習でユーザープロファイリングシステムを採用する方法を示します。

グローバルユーザープロファイリングシステムの構築

Example Corp. は世界的なオンライン書籍販売店であり、世界中に顧客を抱えているとしましょう。Example Corp. は、顧客の名前、ID、住所、支払い方法などの情報を記憶しておき、この情報を顧客の注文を遂行するために使用したいと考えています。この場合、Example Corp. はユーザーの情報を保存するためのユーザープロファイリングシステムが必要です。

このユーザプロファイリングシステムは、次の 2 つの要件を満たす必要があります。まず、Example Corp. はグローバルなオンライン書籍販売店であるため、このユーザープロファイリングシステムは世界中のユーザーをサポートする必要があります。次に、このユーザープロファイリングシステムは、顧客がウェブの遅延を経験しないように、迅速に要求に応答する必要があります。(注文にかかる時間が長くなるほど、顧客が注文を放棄する可能性が高くなります。) この 2 つの要件を満たすために、Amazon DynamoDB グローバルテーブルを使用して Example Corp. のサンプルユーザープロファイリングシステムを作成する方法を説明します。分かりやすくするために、この例では user_iduser_name の属性だけを使用します。

まず、米国西部 (オレゴン) リージョンに UserProfiles という名前の DynamoDB テーブルを作成します。user_id という名前のプライマリキーを持ち、DynamoDB のストリームを有効にする必要があります。次に、同じ設定で欧州 (アイルランド) リージョンにテーブルを作成します。それぞれのテーブルは、それに最も近いリクエストを処理します。たとえば、欧州 (アイルランド) リージョンのテーブルはヨーロッパからのリクエストを処理し、米国西部 (オレゴン) リージョンのテーブルは米国からのリクエストを処理します。この追加のテーブルの利点については、このセクションの後半で説明します。

次のサンプルの Python コードは、米国西部 (オレゴン) リージョンに UserProfiles テーブルを作成します。欧州 (アイルランド) リージョンで同じテーブルを作成するには、コードの region_name を変更する必要があります。テーブルの作成の詳細については、DynamoDB 開発者ガイドテーブルの作成を参照してください。

ddb_client = boto3.client ('dynamodb', region_name='us-west-2')
ddb_client.create_table(
        AttributeDefinitions=[
            {
                'AttributeName': 'user_id',
                'AttributeType': 'S'
            },
        ],
        TableName='UserProfiles',
        KeySchema=[
            {
                'AttributeName': 'user_id',
                'KeyType': 'HASH'
            },
        ],
        ProvisionedThroughput={
            'ReadCapacityUnits': 10,
            'WriteCapacityUnits': 10
        },
        StreamSpecification={
            'StreamEnabled': True,
            'StreamViewType': 'NEW_AND_OLD_IMAGES'
        }
    )

次に、作成したばかりの 2 つのテーブルに基づいてグローバルテーブルを作成します。既存のテーブルからグローバルテーブルを作成する場合、それぞれのテーブルが空であり、同じ名前とキー設定を持つ必要があります。また、グローバルテーブルのレプリカテーブル間で書き込み容量を一貫して設定することを強く推奨します。グローバルテーブルの作成の詳細については、 Boto 3 ドキュメントの create_global_table を参照してください。

ddb_client.create_global_table(
    GlobalTableName='UserProfiles',
    ReplicationGroup=[
        {
            'RegionName': 'us-west-2'
        },
        {
            'RegionName': 'eu-west-1'
        }
    ]
)

次に、ユーザープロファイリングシステムの 2 つの操作のセットを定義して、ユーザー情報を保存および照会できるようにします。put_user メソッドを使用するとユーザー情報を保存することができ、get_user メソッドを使用すると user_id に基づいて情報を照会することができます。

def put_user(user_id, user_name):
    return ddb_table.put_item(
        TableName=table_name,
        Item={
            'user_id' : user_id,
            'user_name' : user_name
        })


def get_user(user_id):
    res = ddb_table.get_item(
        TableName=table_name,
        Key={
            'user_id': user_id
        })
    return res.get('Item')

この時点で、グローバルテーブルに基づくユーザープロファイリングシステムは使用準備完了です!

これで、作成したばかりの put_user メソッドを使用して 2 つのユーザープロファイルを作成し、米国西部 (オレゴン) リージョンのエンドポイントを介してユーザープロファイリングシステムに配置することができます。これらのユーザープロファイルは、グローバルテーブルによって欧州 (アイルランド) リージョンのテーブルに自動的に複製されます。レプリケーションおよびグローバルテーブルの詳細については、グローバルテーブル: その仕組みを参照してください。

{'user_id': '4962', 'user_name': 'user one'}
{'user_id': '8291', 'user_name': 'user two'}

Example Corp. は米国に 1 つ、ヨーロッパに 1 つのウェブサーバーを持っているとします。顧客が米国にある Example Corp. のウェブサイトに接続すると、ウェブサーバーは DynamoDB 米国西部 (オレゴン) リージョンのエンドポイントを介してユーザープロファイリングシステムからユーザープロファイルを照会します。ただし、顧客がヨーロッパの Example Corp. のウェブサイトにアクセスした場合は、米国との間で大陸間のリクエストを行う代わりに、ウェブサイトは欧州 (アイルランド) リージョンのエンドポイントを介してユーザープロファイリングシステムからユーザーのプロファイルを取得します (次の図を参照)。別の大陸からの情報を照会するのと比較して、ローカルレプリケーションからの照会は、私の経験に基づいて、リクエストあたり 200 ミリ秒以上短縮します。また、各ローカルレプリケーションは最終的に一貫しているため、ローカルレプリカ間でのユーザープロファイルの同期について心配する必要はありません。グローバルユーザープロファイリングシステムの概要

DynamoDB でリコメンデーションシステムを適用する方法

ユーザープロファイリングシステムが稼動しているので、Example Corp. は、このシステムを活用して、ターゲットとする書籍のリコメンデーションを顧客に提示したいと考えています。説明を簡単にするため、Example Corp. には既に顧客の特徴に基づいてリコメンデーションを生成する機械学習リコメンデーションシステムがあるとします。特徴は、顧客の購入履歴、閲覧履歴、製品評価などの情報から構築できます。

Example Corp. がリコメンデーションシステムを本稼働環境に組み込むには、ユーザープロファイリングシステムでも顧客の特徴のセットを保存できる必要があります。DynamoDB はスキーマレスなので、任意の形式のデータを簡単に保存して照会することができます。したがって、この DynamoDB ベースのユーザープロファイリングシステムに新しい属性を追加すれば、顧客の特徴を保存してリコメンデーションを生成することができます。

次のコード例は、この新しい属性を追加するために必要なコードの変更を示しています。ユーザーの名前と ID に加えて、user_features という新しい属性を追加していることに注意してください。この属性の形式として JSON オブジェクトを保存することで、任意のデータ形式を JSON にシリアル化してこのユーザープロファイリングシステムに保存することができます。

この例では、Numpy Python ライブラリの配列オブジェクトである numpy.array を顧客の特徴のデータ形式として使用しています。更新された put_user メソッドは user_feature 変数を取り、DynamoDB テーブルに書き込みます。to_json メソッドを使用すると、numpy.array を JSON にシリアル化することができます。from_json メソッドを使用すると、JSON をデシリアライズして numpy.array に戻すことができます。

def put_user(user_id, user_name, user_features):
    return ddb_table.put_item(
        TableName=table_name,
        Item={
            'user_id' : user_id,
            'user_name' : user_name,
            'user_features' : user_features
        })

def to_json(ma):
    return json.dumps(ma.tolist());

def from_json(js):
    return np.array(json.loads(js))

これで、顧客が Example Corp. のオンラインストアを閲覧すると、ユーザープロファイリングサービスが顧客の特徴セットを迅速に提供し、リコメンデーションシステムを通じて特徴セットを実行し、顧客のためのリコメンデーションを生成することができるようになります。

結論

この記事では、DynamoDB グローバルテーブルに基づいてユーザープロファイリングシステムを作成する方法を説明し、グローバルテーブルによって提供される高速かつ一貫性があるグローバルアクセスについて検討しました。また、このユーザープロファイリングシステムと機械学習を組み合わせた例も紹介しました。プロダクションでの機械学習モデルの入力データソースとして機能することに加えて、ユーザープロファイリングシステムは、機械学習モデルを構築するためのデータセットをトレーニングおよびテストするためのデータストアとしても使用できます。


著者について

Jia Zhang は、アマゾン ウェブ サービスのソフトウェア開発エンジニアです。