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

マイクロサービス内で動くAPIをF#で書いている

Avatar for ayato ayato
June 14, 2025
460

 マイクロサービス内で動くAPIをF#で書いている

関数型まつり2025の発表資料

Avatar for ayato

ayato

June 14, 2025
Tweet

Transcript

  1. プロダクトチーム紹介 - XPに基づいたアジャイル開発組織 - 100人超の開発者(SWE, SRE, MLE, TE)が在籍 - ペアプログラミングを中心とした開発

    - チームの最大人数は5人 - 規模が大きくなってもチームで独立して動けるようにする - 自律したチームなので明示的なリーダーは不在 - マイクロサービスとしてサービスを開発している - モノリス -> マイクロサービスをやってきている - 新規機能はマイクロサービスで開発している - モノリス部分は随時リプレース - マイクロサービスの各APIは多種多様な言語で書かれている - ↑大事
  2. F#導入以前のプロダクトチーム - Scala, Kotlin, ClojureなどJVM系言語を筆頭に様々な言語が採用されていた - Elixir, Go, Rustなどの時勢に乗った言語の採用もされていた -

    OCaml, Haskellのようなちょっとレアな言語も採用されていた - フロントエンドではDart, TypeScriptなども採用されていた - 何故か.NET系の言語だけは採用されていなかった
  3. 開発環境 - .NET (Core) - クロスプラットフォームで動く、モダン.NET - dotnetコマンド - ビルドなど

    - Paket - 依存関係の管理 - Ionide - VS Code / Cursorで動作するプラグイン - Fantomas - フォーマッター
  4. ASP.NET Core Minimal APIのスタイルを採用した - 関数プログラミングと親和性が高い - フレームワークよりライブラリの組み合わせが好ましいと考えていた - Library

    patterns: Why frameworks are evil - Tomas Petricek - プロダクトチームとしてはフレームワークに求めている機能が多くはない - 外界を適切に分離して、ドメインを中心に据えたアーキテクチャを好むため ※ ルーティングに対して関数を登録するだけでよく、従来のフレームワークのようにクラスを作ったりアトリビュートを大量に付与する必要がない
  5. Resultに頼りすぎず例外を適切に使う - 関数プログラミングの書籍では例外より Result 型の良さが強調されがち - 現実世界では例外で済む事情をわざわざ Result 型に変換する必要はない -

    特に外界の事情や業務上のエラーではない状態を Result 型に押し込めてはいけない ※ タイムアウトをResult型や判別共用体に変換してまでドメインレイヤーまで持ち上げたくないよね
  6. ドメインは素朴にしたいが…Asyncだけは特別扱い - 以下のように Async を返す関数を引数に取る関数を定義したいことがある - これを無理に消すと Async.RunSynchronously などを使うことになる -

    DDDで集約を跨いだ情報でロジックを構築するための「getter高階関数パターン」の紹介 - F#で Async を無理に外そうとすると大変な目に…(後述)
  7. 大変ではない - F#特有の難しさはあまりない - .NETに慣れていないことで発生している難しさはある - 逆に.NETの運用に慣れていれば簡単に運用できるはず - dotnet-countersのようなツールを知っていれば◎ -

    KubernetesにデプロイしているのでDockerイメージをビルドできれば◎ - 諸々のサービス利用も容易◎ - Datadogでメトリクス収集をしている - yamoryでのスキャンも簡単
  8. 強いて言うなら… - 日本語の情報は例によって少ない - とはいえ、私達の組織にとっては誤差でしかない - そういう言語をよく使っている - .NETやC#に慣れていないことが原因の大変さはある -

    ドキュメントの読み替えや理解がどうしても難しい - 拡張関数とかどのパッケージ開いたらいいの?とかありがち - 生成AIも万能ではない
  9. まとめ - F#らしさを活かした設計をする - ドメインは素朴な関数やレコードを活用 - 一部で抽象度をあげてエラーハンドリングをする - 例外もちゃんと使う -

    非同期はAsyncを適切に利用する - FSharpPlusはすごいが扱うのが難しい - .NETの運用は実務上困ることはない…はず