freee申告の税額計算を支える技術 / freee tech day 2023
by
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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