開発3センター1室Tチームのテザーです。2021年就業型インターンシップに参加し、インターンシップ終了後もアルバイトとして引き続きTチームで働いています。
今回は前回のブログから引き続き、アルバイト期間中に開発したLINE MUSICのLINE公式アカウントメッセージ配信システムのデバッグメッセージ送信機能を紹介したいと思います。
開発背景
開発Tチームは、LINE公式アカウントのMessaging APIを利用し、LINE MUSICの特定のユーザー群を対象にメッセージを配信するシステムを開発しました。送信したメッセージの表示確認するに当たって以下の2つの課題点がありました。
- 今回のシステムは特定の条件で対象のユーザーを抽出してメッセージを送信するようになっています。そのため、テスト用のLINEアカウントが抽出対象になっていないとメッセージが送信されません。
- Batch処理によって決まった時間にメッセージを送信するようになっているので、その時間になるまで待たないとメッセージが送信されません。毎日決まった時間にしか送信されないのは確認しづらいです。
これらを解決するために管理者画面にユーザーのIDを入力し、即時にメッセージが送信できるデバッグメッセージ送信機能を開発することになりました。
LINE MUSICのLINE公式アカウントメッセージ配信システムデバッグ機能について
デバッグメッセージ送信の流れ
この機能はとてもシンプルです。テストのメッセージを送るテストユーザーを指定するだけで、即時にテストメッセージが送信されます。この機能は管理画面の権限を持った人のみが利用できるようになっています。
機能の実装
こんな便利なデバッグメッセージ送信機能ですが、実は元のシステム設計を変更する必要がなく簡単に導入できました。上記の図はメッセージ配信システムの全体的なイメージです。まずはメッセージがどのように作成されて対象ユーザーに届いているのかを図で説明します。
一般運用のときメッセージ配信の流れ
Batch処理として機能するNotification CoreのcreateNotificationMessagesメソッドはcronの呼び出しによって決まった時間にApache Hiveから対象ユーザーを抽出します。
そのあと、抽出した全ユーザーに対してメッセージを作成してMySQLに保存します。
最後にNotification Producerにより保存されたメッセージがKafkaにプロデュースされてMessaging API経由で対象ユーザー群にメッセージが送信されるようになります。
デバッグモードでのメッセージ配信の流れ
デバッグ機能のために新しく実装したNotification CoreのcreateDebugMessageメソッドはcreateNotificationMessagesメソッドとほぼ同じで引数にuserIdが追加されました。
対象ユーザーをHiveから抽出する代わりに管理画面のフォームから受け取ることで、任意のテスト用のLINEアカウントにメッセージの送信が可能となりました。
createDebugMessageメソッドでメッセージを作成し、MySQLに保存した後は一般運用と同じくNotification ProducerがメッセージをKafkaにプロデュースして、最後にNotification ConsumerによってMessaging APIに送信されるようになります。
簡単に実装できた理由
今回のデバッグ機能は元々のシステムを大きく変更せずにできました。
元々のシステムが細かい処理の単位で分かれていて、その処理と処理が疎結合だったので、一部の処理を新しく追加して多くの機能はそのまま再利用できたからです。
今回の例では、メッセージの作成がNotification Core、作成されたメッセージのKafkaへのキューイングがNotification Producerに分かれていて、その間はMySQLによって疎結合になっていました。また、メッセージの作成についてはユーザーの抽出部分を管理画面のフォームから入力する機能(デバッグ機能)を追加し、メッセージの本文の作成の仕組みは既存のものを再利用できました。
システムを細かい処理で分け、それらを疎結合にすることで、後から機能追加するのが簡単になります。
この開発で学んだこと
このデバッグ機能を開発するうちにサーバーサイド開発の知識はもちろん、エンジニアとして不可欠なスキルであるテストを書くスキルも高めることができたと感じました。チームメンバーにPull Requestするときに必ずレビューをしてもらえたので、自分では考慮がもれていた部分やよりいいコードの書き方を気付かせてもらえます。
例えばいくつかのパターンがあるにもかかわらず、テストが一つのパターンの分しか配慮できなかったことがありました。メッセージ配信システムは目的に応じた送信パターンを複数提供しています。しかし、このデバッグ機能ではその全てに対応できていません。デバッグ機能が対応しているパターンだけテスト書いたので、未対応パターンのテストも書く必要があることを指摘してもらいました。
以下の写真のようにデバッグ機能が対応している条件パターンだけではなく、未対応の条件パターンもテストの必要があると指摘をもらえました。
未対応の処理のためにもエラー出力のテストを書く必要がある事に気づきました。
以下のレビューコメントでは、magic numberを使ったことで意図が伝わらなかったことを指摘されました。
既に実装されているメッセージを作成するメソッドを再利用しようとしたとき、userNoをユニークなidではなくてユーザーの順番だと思っていました。そのため、順番として扱っていることがわかるように定数化してコメントもつけました。順番として扱おうとしていることを理解してもらいましたが、それは間違いだと指摘してもらいました。
このように間違った理解を訂正してもらうためにも、まずは伝わるコードを書かなければいけないことに気づきました。
またサービス開発においての個人情報の扱いや、セキュリティの注意点や対策などについても教えてもらえたのでエンジニアとして気をつけるべき点を学ぶことができました。例えば、User IDを入力する部分においてクエリパラメーターにUser IDを入れていましたが、アクセスログに残らないようにPOSTリクエストのbodyを使う方が良いことや、たとえ社内のネットワークであっても必要な場合にのみ適切な環境で管理するなど、意識付けが必要な部分など指摘してくれました。
まとめ
本記事ではLINE MUSICがLINE公式アカウントのMessaging APIを使ったメッセージ配信システムにおいてどのようにデバッグをしているのかを紹介しました。このデバッグ機能によって今後、このメッセージ配信システム開発において開発確認やQAによるテストが効率化できそうです。LINE公式アカウントのMessaging APIを使っているサービスを開発されている方にも本記事が役に立つ情報になればと思います。