Upgrade to Pro — share decks privately, control downloads, hide ads and more …

非同期メッセージングサービスを使ったLINEメッセージ配信の改善/improve-oa-messaging-with-asynchronous-architecture

hirai.kazushi
November 27, 2022

 非同期メッセージングサービスを使ったLINEメッセージ配信の改善/improve-oa-messaging-with-asynchronous-architecture

LINE STOREという、LINEの各デジタルアイテムを販売するWebアプリケーションを開発しています。
LINE STOREでは、多くの場面でLINE STOREの公式アカウントからユーザにメッセージ配信を行っています。
たとえば、ユーザがスタンプ購入後の購入完了通知やボーナスクレジット付与通知などです。

このメッセージ配信処理を、同期処理からメッセージングマイクロサービスを使った非同期処理に移行し、課題を改善したことを共有します。

以下イベントでの登壇資料です。
https://fortee.jp/jjug-ccc-2022-fall/proposal/e771a13a-75e2-4cd3-aaef-4c02eda1622b

hirai.kazushi

November 27, 2022
Tweet

More Decks by hirai.kazushi

Other Decks in Technology

Transcript

  1. ⾮同期メッセージングサービスを使った
    LINEメッセージ配信の改善
    Kazushi Hirai

    View Slide

  2. ⾃⼰紹介
    l LINE Fukuoka 株式会社
    l 開発1室 Dev K team Manager
    l LINE STORE
    l Server-side Engineer
    l 2 kids
    l Interests/Hobbies
    l Exercising / Marathon
    l Twitter: @hkazushi0627
    ฏҪ Ұ࢙
    ,";64)*)*3"*

    View Slide

  3. 発表の流れ
    l プロダクトと関連テクノロジーの紹介
    l メッセージ配信の改善案と利点、⽋点
    l ⾮同期メッセージングアーキテクチャとテクノロジースタック
    l 開発を⾏う上で⼯夫した点
    アジェンダ

    View Slide

  4. LINE STORE
    https://store.line.me
    l LINEの各デジタルアイテムを販売する
    公式オンラインストア
    l LINEスタンプ/絵⽂字/着せかえ
    l マンガ、占い、LIVE、ゲーム などのLINE関連
    サービスの⼀次通貨
    l LINEスタンプ プレミアム、LINE MUSIC
    l 多くの決済⽅法サポート
    l クレジットカード、LINE Pay、PayPay、
    キャリア決済
    l テクノロジースタック
    l Java、Spring-MVC
    LINE STORE

    View Slide

  5. l LINE公式アカウント経由でLINEメッセージを送る
    l LINE公式アカウント(Official account) = OA
    l LINE Messaging APIをコール
    l -*/&4503&Ͱͷ׆༻ྫ
    l 購⼊完了メッセージ、クレジットバック付与通知
    l サブスクリプションの定期決済通知
    l 新作、おすすめスタンプ通知
    OA Message

    View Slide

  6. l レイアウトを⾃由にカスタマイズできるメッセージ
    l JSONデータで構成
    l LINE Messaging API の POST bodyに宛先(To)とJSONデータを設定
    Flex message
    省略

    View Slide

  7. メッセージ配信の課題
    購⼊完了後に、購⼊完了メッセージ、クレジットバック付与を通知する
    ケース
    Messaging APIがエラーになった場合の考慮不⾜
    l コールバックレスポンスがエラーになる
    Messaging APIのレート制限の考慮不⾜
    l 1アカウントごとに2,000QPSの制限
    メッセージ配信の課題

    View Slide

  8. Idea1: Try-catch
    改善案1︓Try-catchの追加
    Messaging APIのコールにTry-catchを追加。エラーになったときはcatchする。
    対策
    エラーになったときに、メッセージがロスト
    処理が単純
    エラーの頻度が少なければ、あとから⼿動で再送
    するのもあり

    View Slide

  9. Idea2: Add Retry Logic
    改善案2︓リトライの追加
    Messaging APIが成功するまでリトライする。
    対策
    失敗した場合もリトライで再送可能
    リトライ回数に⽐例して、コールバックレスポンスが遅延
    l 成功するまでレスポンスが返らない
    最⼤リトライ回数の設定

    View Slide

  10. Idea3: Retry asynchronously
    改善案3︓⾮同期でリトライする
    別スレッドを作成してリトライする。スレッドの終了は待たない。
    対策
    コールバックレスポンスはスレッド起動後、すぐに返却
    コールバック完了は、あくまで受付完了
    l Messaging APIの処理完了ではない
    処理が複雑
    リトライ中にアプリケーションが再起動されると
    状態がロスト

    View Slide

  11. Idea4: Build async message service
    改善案4︓⾮同期マイクロサービスを追加
    Messaging APIのコールとリトライを別のマイクロサービスに切り出す。
    対策
    Applicationの処理は単純
    Queueで状態を管理
    失敗時は、イベントを再度Queueに登録して
    リトライする

    View Slide

  12. Async message architecture / Tech stack
    ⾮同期マイクロサービスアーキテクチャ/テクノロジースタック
    メッセージキュー
    l Apache Kafka
    l LINE共通のクラスタ。⾼信頼性。
    l リトライ⽤トピック
    Consumer
    l Decatonを使⽤して開発

    View Slide

  13. LINE Decaton
    l LINEのOSS https://github.com/line/decaton
    l Kafka Consumerライブラリ
    l パーティションをマルチスレッドで同時に処理
    l リトライ機能
    l レイトリミッター機能
    Decaton
    最⼤1時間のエラーに耐えられる
    ように設定
    リトライ間隔と最⼤リトライ回数を設定
    パーティションごとのQPSを設定
    Message APIのレート制限
    (2,000QPS) への対策

    View Slide

  14. 開発を⾏う上で⼯夫した点
    各コンポーネントの役割︓
    Producer(Application)
    l Kafkaにイベント登録
    Consumer
    l Messaging APIのコール
    l 失敗時のリトライ

    View Slide

  15. 開発を⾏う上で⼯夫した点/課題
    各コンポーネントの役割︓
    Producer(Application)
    l Kafkaにイベント登録
    Consumer
    l Messaging APIのコール
    l 失敗時のリトライ
    Consumerで⾏う メッセージごとにProducer、Consumerの開発が必要
    Messaging APIのリクエスト=Flex Messageの作成はどこで⾏うべきか︖
    課題

    View Slide

  16. 開発を⾏う上で⼯夫した点/対策
    Producer(Application)
    l Kafkaにイベント登録
    l Flex message作成
    Consumer
    l Messaging APIのコール
    l 失敗時のリトライ
    messsage StoreOaPushMessageEvent
    {
    string messageId = 1;
    int channelId = 2;
    string serializedPushMessage = 3;
    Flex messageのJSONデータを
    Kafkaのイベントに設定
    新しいメッセージ追加時もProducerの
    開発のみで対応可能
    対策
    Kafkaイベント︓

    View Slide

  17. 発表の流れ
    l プロダクトと関連テクノロジーの紹介
    l メッセージ配信の改善案と利点、⽋点
    l ⾮同期メッセージングアーキテクチャとテクノロジースタック
    l 開発を⾏う上で⼯夫した点
    まとめ

    View Slide

  18. THANK YOU!

    View Slide