これは #プリッカソン Advent Calendar 2020 - Adventar の2日目です。
10月の プリマップ 公開以降見た目はほとんど変わってないのですが裏側をちょいちょい改善してるのでメモ
- ジオコーディング前に住所をいい感じにしている
- データ集計処理の高速化
- 公式のデータが間違っていたのでタカラトミーアーツさんのサポートに報告して直してもらった
- プリパラとプリ☆チャンで店舗名が微妙に食い違ってるんで名寄せした
ジオコーディング前に住所をいい感じにしている
公式の店舗リストの住所には「東京都新宿区西新宿1-11-1ゲームホビー館」のように建物名が入ってることが多いのですが、この手の住所をそのままジオコーディング(住所から緯度経度を取得)すると高確率で意図しない緯度経度が返ってくるため「東京都新宿区西新宿1-11-1」のように建物名を削ってやる必要があります。
この手の前処理はリリース前から実装自体はしてたものの、日本の住所表記はバリエーションが豊富なのでリリース以降も気づきベースでちょいちょい修正してました
- プロダクトコード:https://github.com/sue445/primap/blob/85812fa761f5cfb75cf8d702175861be70df578d/function/db/shop_entity.go#L138-L151
- テストコード:https://github.com/sue445/primap/blob/85812fa761f5cfb75cf8d702175861be70df578d/function/db/shop_entity_test.go#L440-L563
プロダクトコードだけ見ると正規表現がアレなのでテストコード見た方が分かりやすいと思います。
データ集計処理の高速化
2200件近い店舗情報をFirestoreに一度に保存する関係上GCPのPub/Subのtopic *1 を使ってCloud Functionsで大量に並列処理をしているのですが、topicに積むところが遅かったのでパフォーマンスチューニングしました。
デバッグログ仕込んで各処理の実行時間を計測したら改善できそうな処理が2箇所あったのでそれぞれ修正。
2200件もあるとPub/Subのtopicに積むだけで遅いのでgoroutineで並列化しました。ここだけで50秒から1~7秒くらいに改善。(実行時間があまり安定しない・・・)
削除された店舗一覧を調べるために「Firestoreに保存済の店舗一覧 - prismdbで取得した店舗一覧」みたいなことをやるためにGoのslice同士の引き算を行ってるのですが、そこの処理が遅かったのを改修。 ベンチマークレベルだと300倍速くなっていてCloud Functions上でも9秒から1秒前後に改善。
改修前はトータルで1分弱かかってた処理が4~8秒で終わるようになりました。
公式のデータが間違っていたのでタカラトミーアーツさんのサポートに報告して直してもらった
プリマップでは間接的*2に公式の店舗リストを使ってるのですが公式のデータが一部間違ってるせいでプリマップのデータも変なことになってたのでタカラトミーアーツさんに報告して直してもらいました。
プリ☆チャンとプリパラの公式サイトの遊べるお店の一覧を見てたらデータおかしいのがあったのでタカラトミーアーツさんのサポートに報告して修正してもらった
— sue445 (@sue445) 2020年11月25日
公式情報が直ったのでプリマップ( https://t.co/7KmVcO63oN )の情報も自動で直って便利!
報告した内容はスクショ参照(計16件) pic.twitter.com/pn9OpPMFbR
件数多かったけど報告したその日のうちに全部直してもらったので不満を持ってる人はどんどん報告すればいいと思います。
余談ですがタカラトミーアーツサポートへの連絡先は2つありました。
1つ目は返信不要なやつで2つ目は返信を受け取りたい時のものかと思われます。僕は修正報告を受けたかったので後者で報告しました。
プリパラとプリ☆チャンで店舗名が微妙に食い違ってるんで名寄せした
プリマップでは店舗名をFirestoreのコレクションのKeyにしてるのでKeyが食い違うと同一店舗なのにプリパラとプリ☆チャンで1つずつ出てくる状態になって不便です。(こういうのが2200件中50件くらいありました)
明らかに情報が間違ってる場合には公式に直してもらえばいいんですが、今回のケースは完全にこっちの都合なのでプリマップ側で名寄せしてます。
ほとんどの場合「△△△△△(ゲームセンターや量販店の名前) ○○(支店名)店」と「△△△△△ ○○」で表記ゆれしてたので機械的に「店」を削るだけで済んだのですが*3、それでも名寄せできなかったものがあったのでそこだけ名寄せ用のマッピングを作りました *4
*1:sidekiqやresqueでいうところのqueueみたいなもの
*2:prismdbが店舗リストを取得して、さらにそれをプリマップが使っている形
*3:https://github.com/sue445/primap/blob/9366ac30761b83f5daf6578ae1a9f361e15940fb/function/config/aggregate_shops.go#L47-L54
*4:https://github.com/sue445/primap/blob/9366ac30761b83f5daf6578ae1a9f361e15940fb/function/config/aggregate_shops.go#L12-L31