京都 (大阪)
データベース書き込み性能劣化の原因を調査する
Bill One
構成
Cloud SQL
PostgreSQL
Cloud Tasks
Cloud Pub/Sub
Transactional Outboxパターン
月初に一部のAPIでレイテンシ悪化
先に結論
書き込みのみのテーブルのパフォーマンス問題
キャッシュのされやすさを考慮する
UUIDv4
非同期処理に関するAPIのレイテンシが大きく悪化
分散トレーシングで突き止めた
INSERTに1.8秒ほどかかっており遅い
イベント発行済テーブルへの書き込み
DBレイヤの調査
イベント管理テーブルのインデックスのキャッシュヒット率が低い
インデックスの再構築による書き込み性能の劣化
メトリクスに現れにくい
読み込みのほうが支配的
対策
データ量を減らす
時系列でソート可能なIDを使う
Partition Table
リードレプリカ
RDB以外を使う
スクラム・アジャイル関連の話題(未定)
クラウド会計Plus
複数のスクラムチームで開発
海外拠点含む
スプリントレビュー
スクラムマスターがコミュニティで有名な人たちだった
退職
ビジネス側を巻き込んでくれていた
いまいち「お祭り感」がない
開発が増えてビジネスが減っていた
欲しい情報がない
スクラムマスターが期待値調整してくれていた
ビジネス側とは
CS/CR/Sales
業種によって欲しい情報の粒度が異なる
プロダクトオーナーにお願い
情報粒度
草の根的な交流
英語化
ビジネス側は日本語
通知基盤システムにおける堅牢なテンプレートの仕組み
通知基盤ができる前
各プロダクトが個別に通知の仕組みを用意していて非効率
事前に通知テンプレートを通知基盤に登録する
YAML
Goのテンプレート記法
通知基盤へのリクエストパラメータ
リッチな通知テンプレート
Slackのblock kitを例に
JSONを組み立てられる
JSONに対するインジェクションが発生しうる
堅牢な通知テンプレート
Mapに変換したJSONを再帰的に置換していく
力強い
TypeScript x 関数型ドメインモデリング
CHILLNN
TypeScriptバックエンド
コードに資産価値がまだない状況
稼げるプロダクトを作るために走る
コードは汚れていく
綺麗にしていくという力学は働かない
PMF後
競合は技術的負債なしで初期開発できる
経営的観点から見た「コードの品質」
資産運用効率が良い
エンジニア1人あたりの生産性が高い
技術的な「良いコード」とは?
人材は流動的な資産である
+ ドメイン知識の学習が用意である
プロダクト固有の知識が最大のボトルネック
属人性
エンジニアが学習するモチベーションを保ちづらい
副作用の増加
ドメイン知識の学習フローをデザインしたリアーキテクチャリング
知識の獲得
レバレッジが効く
アーキテクチャに求める要件
何から学びはじめるかが明確
必要な知識が独立しつつゆるやかにつながっている
ソフトウェアとは「データ」と「関数」
「データ」をドメイン知識を積み上げる基礎にする
ビジネスロジック
正しさはドメインエキスパートの頭にしかない
副作用
「アトミックな関数」しか実装できないようにする
2つのルール
ドメインオブジェクトは純粋
ドメインオブジェクトを引数に取る関数でアプリケーションを構築する
ビジネスロジックはドメインオブジェクトの状態遷移として型で表現する
構造化プログラミングへの先祖返り?
以前とは型の表現力が上がっている
具体例
ドメインオブジェクトが大きい
ドメインオブジェクトを引数に持つ関数
コロケーションパターン
ファイル名がドキュメントとして機能する
1ファイル1関数
テキストファイルは2次元だがファイル構造まで含めると3次元まで表現できる
human-orientedなアーキテクチャ
ビジネスロジックを型で表現
コンパイラレベルでビジネスロジックを表現できる
アトミックな処理しか実装しづらい
処理を追いやすくなる
自明な依存は表現力の上がった現代ではむしろ有用
状態遷移を型として定義
とりうる遷移が絞られる
カリー化で依存注入
関数を合成して一連のワークフローを表現
ワークフローのドキュメントとしても表現できる
アプリケーションを垂直ではなく水平に拡張していく
mypy plugin に入門して自社OSSを型安全に
エムスリー
型とインタフェースをちゃんとしよう
MLパイプライン
gokart
特徴
処理の1つ1つをTaskとしてクラス定義
再利用性やテスト容易性を高める
Pythonの型事情
Protocol
型を前提としてサードパーティーライブラリ
FastAPI
Pydantic
mypy
dataclassはビルトインだが型チェックできない
@dataclass
クラス変数がインスタンス変数に化ける
mypy plugin
ないなら作ればいいじゃない
静的解析時だけコンストラクタを作る
add_method_to_class
AnnotatedというPEPがある
ORMを使わないでmigration管理したい
FaaSを使って実装する案件
Hono
マイグレーション機能はない
これまでのインフラ構成
Prisma
FaaSに採用するには重い
マイグレーションのみで使う
うまみが少ない
sqldef
DBスキーマをファイルに書き出せる
差分をALTER TABLE文として実行する
ロールバック用のSQLが不要
デメリット
パーティションの定義ができない
他の選択肢
sqlx-cli
goose