このガイドでは、PythonとRedisを使って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ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ