この記事はtomita@atuwebがお届けします。
以下、コメントについてのブログ記事が話題になってたようです。

「このくらいは良くあるな」という感想を持ってしまった私は相当業界に染まっているのですね。
実際、こういったひどいコメント、ひどいプログラムは定期的に話題に上がるものです。

本当に、Badなコードの撲滅は難しいことを感じずにはいられません。

驚愕のとしたコメント

これは数年前、稼働中の某ブラウザ系ソーシャルゲームのお手伝いをした時に、こんなコメントを見てびっくり。

それは、、、ドーン!

<?php
// TODO トランザクションする
public function update($params) {
    :
    :

えええ、、、!
トランザクションしてないんか~い!

さすがに関数の中身を調べるまでもなく、バグが残っているコードだということが一発で分かりました。
(その意味で、コメントがしっかり役目を果たしていますねw)

トラブルの発生と解決

このコメントが差し込んであったところはソシャゲのプレゼントボックスでした。

プレゼントボックスとは、、、

  • ゲーム中に発生した報酬が届く箱
  • マネー、アイテム、カードなど多様なリソースが雑多に並ぶ
  • ユーザが任意のタイミングで報酬を受け取ることが可能

とまあ、「裏では泥臭いことをやらないといけない機能」の代表ですね。
多様なリソースを取り扱うため実装が複雑になりやすく、それに負荷も高くなりやすい機能です。

プレゼントが消えちゃったんですけれども

こういったサポートがエスカレしてきたときに「やっぱりー」と感じました。

ソースを渋々追ってみると、次の順番で処理していることが分かりました。

  • 1.プレゼント情報をロードする
  • 2.プレゼント情報を物理削除する
  • 3.ユーザにプレゼントを付与する

2:削除後 かつ 3:付与前に障害が発生すると、「プレゼントが永久に消失してしまい、ユーザからクレームが寄せられ」ます。
Web開発の教科書に書かれるような分かりやすい処理でした。

解決方法

トランザクションを行いアトミックに処理するように作り変えてください。

アトミックとは「処理するか、処理しないか」どちらかの状態しか存在しない、という特性で、この特性により矛盾が発生することを防ぎます。

速やかに修正することが難しい場合は「A.ユーザにプレゼントを付与し」「B.付与済みのプレゼントを削除する」というように、処理の順番を変えるだけでも、ユーザにとって不利益はなくなりますから応急処置になります。



2016年06月10日:見出しレベルを変更しました。
2016年04月25日:過去に公開していた記事を少しリライトして再公開しました。

スポンサーリンク
ad_336
ad_336
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク
ad_336