PythonとRedisを使ってAlibabaクラウド上にゲームリーダーボードを構築


このガイドでは、PythonRedisを使ってAlibaba Cloud上にゲームリーダーボードを構築していきます。

本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。

目的

このデモの主なアイデアは、ゲームアプリケーションでリーダーボードを生成するためにデータベースを叩くのではなく、キャッシュ層(Redis)を使用することです。このアプローチは、リアルタイムの応答を必要とする大規模なデータベースに適しています。

前提条件

必須ではありませんが、Pythonの基本的な理解があることはプラスになります(サンプルコードはPythonです)。今回はRedisを活用しているので、Redisがどんなものなのかを知るためにも読んでおくと良いでしょう。

Alibaba CloudでのRedisクラスタの作成については、このガイドで別途ステップバイステップのコマンドを読んで、それに沿って進めていけばいいので、ここでは割愛します。設定は簡単でわかりやすいです。

実施の様子

1、Elastic Compute Service(ECS)ApsaraDB for Redisのセットアップを行います。このチュートリアルでは、OSとしてUbuntu 16.04を使用していますが、ソリューション自体はどのOSでも可能です。選択したOSによってコードが若干異なる場合があります。
2、ECSサーバにログインします。

ssh -i  root@

3、環境をインストールするための手順を実行します。

rm /usr/bin/python # Change python into version 3
ln -s /usr/bin/python3 /usr/bin/python
apt-get update # Update Ubuntu
export LC_ALL=C # Set Locale
apt-get install python3-pip # Install pip
pip install redis # Install python-redis
apt-get install apache2 # Install apache
mkdir /var/www/python # Set Environment
a2dismod mpm_event
a2enmod mpm_prefork cgi

4、etc/apache2/sites-enabled/000-default.conf を置き換えます。

-----
<VirtualHost *:80>
        DocumentRoot /var/www/python
        <Directory /var/www/python>
                Options +ExecCGI
                DirectoryIndex leaderboards.py
        </Directory>
        AddHandler cgi-script .py
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
-----

5、そのファイルを/var/www/leaderboards.pyに置き、8行目の設定を編集します(以下のソースコード)。
6、ファイル内のパーミッションを編集します。

chmod 755 /var/www/python/leaderboards.py

7、Apache を再起動します。

service apache2 restart

8、ウェブブラウザにアクセスして、パブリックIPアドレスを入力してください。それが動作しているかを見る必要があります。

コード説明

以下はPythonでのコードサンプルですが、これについてはさらに説明します。

コードの説明:
1、Redisに接続します(8行目):

r = redis.StrictRedis(host='', port=6379, db=0, password='') 

これを正しく動作させるためには、ホスト名とパスワードを更新する必要があります。ApsaraDB for Redisの作成時に「接続アドレス」から取得できます。作成時に設定したパスワードでもあります。

2、リーダーボードにスコアを追加します(16行目)

r.zincrby(leaderboardName, gamer, random.randint(1,1000000)) 

LeaderboardName はリーダーボードの名前に設定するキー、gamer はゲーマーのユーザー名または ID、最後のパラメータはスコアを入れる場所です (この場合は乱数です)。

3、最高スコアのトップ10を取得します(19行目)。

r.zrange(leaderboardName, 0, 9, desc=True, withscores=True)

LeaderboardNameはリーダーボードの名前を設定するキーで、2番目のパラメータはどのランクから開始するか(0が開始)、3番目のパラメータはどこで停止するか(-1で最後まで表示する)です。値desc=Trueは、リーダーボードを降順にソートします(デフォルトではFalse)。

4、現在のプレイヤーの順位を取得します (30行目)。

r.zrevrank(leaderboardName, gamer)+1

LeaderboardNameはリーダーボードの名前に設定するキーで、gamerはゲーマーのユーザー名またはIDです。データベースではランクは1ではなく0から始まるので、1つ(+1)を追加する必要があります。
5、現在のプレイヤー(または誰でも)のスコアを取得します(34行目)。

r.zscore(leaderboardName, gamer) 

LeaderboardNameはリーダーボードの名前に設定するキーで、gamerはゲーマーのユーザー名またはIDです。

コードを実行する

以下は、ウェブサーバ上でコードを実行したときの期待されるレスポンスです。

結論

Redisはデータをインメモリで保存し、製品の成熟度によって毎秒数百万リクエストのパフォーマンスに達することができます。このため、このユースケースやその他のキャッシングニーズに最適なデータベースとなっています。

Alibaba Cloud上のRedisの詳細については、ApsaraDB for Redisのページを参照してください。

アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ