Slide 1

Slide 1 text

freee申告の 税額計算を⽀える技術 mosa 2023年4⽉16⽇

Slide 2

Slide 2 text

ここに円に切り抜いた画像を入れてく ださい mosa Software Engineerとして数社を経て2022年 にfreee⼊社。現在はfreee申告の開発を担 当。 Webアプリケーションエンジニア

Slide 3

Slide 3 text

  freee申告

Slide 4

Slide 4 text

  税額計算とは ● [16]と[17]を⼊⼒すると[18]は⾃動で計算されて表⽰される

Slide 5

Slide 5 text

  税額計算とは ● 他の帳票にも値は連携され更新先や更新元が複数あることも

Slide 6

Slide 6 text

  項⽬間の依存は⼤量にある... ●

Slide 7

Slide 7 text

  どのように税額計算をしているか ● RelationalTreeという税額計算をするためのモジュールを作成 ● RelationalTreeは名前の通り項⽬間の関係を⽊構造として動的に組み ⽴てながら計算を⾏う

Slide 8

Slide 8 text

  RelationalTreeの動作例 A C D B 下記のような1項⽬を表す

Slide 9

Slide 9 text

  項⽬Aをユーザーが⼿動で⼊⼒ A C D B 未到達 更新対象 差分あり 差分なし ⾊の意味 キュー

Slide 10

Slide 10 text

  A(root node) をキューに詰める A C D B 未到達 更新対象 差分あり 差分なし ⾊の意味 キュー A

Slide 11

Slide 11 text

  キューからAを取り出して計算 A C D B 未到達 更新対象 差分あり 差分なし ⾊の意味 キュー A ● 今回はユーザーが A を⼊⼒したとしているのでAはユーザーの⼊⼒値となり、 差分ありになる

Slide 12

Slide 12 text

  Aが差分ありなのでAに依存する項⽬ (B, C) を取得してキューに詰める A C D B 未到達 更新対象 差分あり 差分なし ⾊の意味 キュー A B C

Slide 13

Slide 13 text

  A C D B 未到達 更新対象 差分あり 差分なし ⾊の意味 キュー A B C キューの先頭から B を取り出して計算 ● 今回は計算の結果、差分があったとする ● Bに依存している項⽬は無いので差分ありでもキューに詰める項⽬は無い

Slide 14

Slide 14 text

  A C D B 未到達 更新対象 差分あり 差分なし ⾊の意味 キュー A B C キューの先頭から C を取り出して計算 ● 今回は計算の結果、差分はなかったとする ● Cに依存している項⽬はあるが差分は無いためキューに詰めない

Slide 15

Slide 15 text

  A C D B 未到達 更新対象 差分あり 差分なし ⾊の意味 キュー A B C キューが空になったので計算処理を終了してDBに書き込む ● 今までの計算によって得られた A, B の差分はメモリ上に保持してある

Slide 16

Slide 16 text

  RelationalTree動作まとめ 1. 根 (root_node) となる項⽬の計算を⾏う 2. 計算前後で差分があるか確認し、差分がなければ終了する 3. その項⽬に依存している項⽬を取得してキューに詰める 4. キューにある先頭の項⽬について計算を⾏う (FIFO) 5. 2.に戻る

Slide 17

Slide 17 text

  RelationalTree作成の背景 ● 帳票が増えていく中で「1回のリクエストで税額計算に数⼗秒かか る」というパフォーマンス的な問題が発⽣ ● ⼀項⽬ずつ⼿続き的に計算→保存を繰り返すことで DB の read/write 処理が膨⼤な量になってしまい結果として数⼗秒かかってしまった

Slide 18

Slide 18 text

  RelationalTree作成後 ● 問題を解決するためにRelationalTree は下記のアプローチをした ○ メモリ上に計算過程の結果を保持し最後にまとめてwriteする ■ → write回数の減少 ○ 差分が無い項⽬については依存する項⽬の再計算を⾏わない ■ → 計算回数の減少 RelationalTreeの導⼊によって数⼗秒かかっていたリクエストが、遅く ても数秒以内に返ってくるようになった!

Slide 19

Slide 19 text

すごい!!!!

Slide 20

Slide 20 text

  RelationalTreeの課題 ● パフォーマンス最適化の余地 ○ 動的に⽊構造を作成しているため read 処理が多い ○ 部分⽊の計算が繰り返し⾛ることがある ○ 同期的な計算が強制されてしまう ● 計算結果の品質担保 ○ 複数ユーザーが同時に触った時の挙動が担保されていない ● 依存関係の表現⽅法 ○ 依存関係が有向⾮巡回グラフであることを強制できていない

Slide 21

Slide 21 text

RelationalTreeの 改善は続く!

Slide 22

Slide 22 text

No content