ビットコインの価格変動をアプリでお知らせする運用を楽にする開発をしました(後編)

この記事はコインチェック株式会社のアドベントカレンダー3日目(シリーズ2)の記事です。  

コインチェック株式会社のカレンダー | Advent Calendar 2024 - Qiita


はじめに


販売所事業部 バックエンドGの渡邊です。

この記事では昨日の前編に続いて、価格PUSH通知botの実装についてお話しします。

 

仕組みを考える


最初に価格変動のプッシュ通知運用の課題に対する解決案を考えた時、まず全自動化することを考えました。

やっていることはシンプルで、価格変動の検知とプッシュ通知がメインなので、これだけであればシステムによって自動化することができると思ったからです。

しかし、全自動化するにはいくつかの課題がありました。

一番大きな課題として、現状、Coincheckのシステムに不測の事態が発生しているというステータスをシステムのみで判断することが難しく、人的判断を必要とすることがあるため、プッシュ通知を送信すべきでない状況をシステムのみで判断できないというものがありました。

この他にも様々な条件下でプッシュ通知を送信しないという判断をすることが多い運用であることが想定されたため、

結論として、プッシュ通知の送信を実行するアクションは引き続き人間が担当し、その他を自動化するという半自動化システムを実装することにしました。

プッシュ通知の送信を実行する仕組みはSlack botを利用することにしました。理由としては、コインチェックではSlackを普段から利用している部分が多く、システムのエラー通知といったものもSlack通知するようにしており、業務で利用するツールの範囲を広げたくないというものと、非営業日にスマートフォンだけで完結できる運用を目指していたからです。

 

価格PUSH通知botの実装構成


バックエンドはCoincheckアプリでも利用しているRuby on Railsのリポジトリに乗せることにしました。

理由として、普段の開発しているものなので実装スピードが出せるというのと、価格変動の検知で必要なデータを、アプリで利用しているものと同じデータベースで参照できる点が大きいです。

 

それでは、処理について説明していきます。

 

まず事前準備として行なっている、プッシュ通知送信グループ分けについて説明します。

こちらはCoincheckアプリをインストールした後の初回起動時に、デバイスのFirebase IDトークンをデータベースに保存しつつ、トピックに登録するというものです。

トピックとはFirebase Cloud Messagingの仕組みで、一言でいうとプッシュ通知の送信グループです。トピックに登録されているIDトークンに対して一括でプッシュ通知ができます。

工夫している点として、前編でお話したように、プッシュ通知を一気に全Coincheckユーザーに対して送信してしまうと、そのプッシュ通知からアプリを開きCoincheckへのアクセスが集中的に増加してしまう懸念があるので、トピックを複数個用意し、プッシュ通知を送信する際にはずらして送信するようにしています

具体的には、topic_0, topic_1, …, topic_119 という120個のトピックを用意し、CoincheckアカウントのIDを120で割った余りに対応するトピックにIDトークンを登録しています。

 

続いて、価格PUSH通知botの実装について説明します。

価格変動チェックを5分おきに行い、価格変動を検知した場合は価格PUSH通知botからSlackに価格変動情報とPUSH送信実行ボタンを投稿するようにSlack APIを実行します。

ただし、前回の価格PUSH通知botのSlack投稿間隔が最低6時間となるように制御しています

これはなぜかというと、もともとの運用ではプッシュ通知を送信する頻度は、「午前(9:00~13:30)」「午後(14:30~19:00)」「夜(19:00~22:00)」の3つの期間に区切って、それぞれ1回まで送信するというルールにしていました。

これをプログラムで実現するにあたり、「前回のプッシュ通知から6時間の間隔を空ける」とシンプルなものにしたためです。

 

次に価格PUSH通知botがSlack投稿をした後の処理ですが、

担当者によってPUSH送信実行ボタンが押されると、Slack APIによってRuby on Railsへリクエストが送信されます。これを受け取ると、Ruby on RailsではFirebase Cloud Messaging APIを実行し、プッシュ通知の送信をリクエストします。

この際、事前準備のところでお話した120個のトピックに対しランダムな順番で15秒おきにリクエストをします。ランダムな順番にすることで毎回のプッシュ通知で届く順番が固定化されずCoincheckアカウントのIDによって不平等とならないようにしています。また、120個のトピックに対し15秒おきにリクエストをするので、プッシュ通知の送信が開始されてから完了するまでに30分弱の時間をかけており、負荷の分散を実現しています

 

ちなみに、PUSH送信実行ボタンを押せるのは担当者が属するSlackメンショングループに限定するなど、細かい部分も実装してたりします。

 

おわりに


2日間にわたって価格変動のプッシュ通知運用を楽にした話をしてきました。我々バックエンドGはスクラムを採用しており、アジャイルな開発でプロダクトを生み出していっていますが、価格PUSH通知botの開発は途中で臨機応変に実装方針を変えたりしながら、やりたいように進められて非常に楽しかったです。

とりあえずは、まず運用できるものを作るという目標で実装を進め、当初の課題が明らかになってから運用に乗るまで3ヶ月程度で作り上げました(他の業務もしつつだったので、集中的にできればもっと短期間でできたと思います)。そのためまだまだ改善の余地があるのが現状です。具体的には、プッシュ通知を送る通貨や送信内容をより柔軟にできるような機能の実装や、プッシュ通知のマーケティング効果測定も自動で行えるようにしたいです。