#バックエンド

エンジニアはフィンテックシステムのためのフィールドガイドを得る

Marta Kowalska
Marta Kowalska
1 min read

Fintech Engineering Handbook は、ソフトウェアチームが、価値を生み出したり失ったりすることなく、お金を移動・記録・監査するシステムを構築するための実践的な指針を示します。

Fintech Engineering Handbook は、お金を扱うソフトウェアを構築するエンジニア向けに、台帳設計や冪等性から、Webhook、照合、アクセス制御、本番テストまで、実践的なパターン集を示しています。

このハンドブックは、他のソフトウェア分野からフィンテックに加わるエンジニアを想定しています。SNS アプリなら重複通知から回復できますが、金銭システムは重複出金、切り捨てられた手数料、欠落した精算記録を見過ごすわけにはいきません。このガイドは、その仕事を 3 つの原則に整理しています。データを捏造しない、データを失わない、外部システムも内部システムも検査なしには信用しない、ということです。

最初の教訓は表現です。お金には金額と通貨が必要であり、用途に十分な精度で保存しなければなりません。ハンドブックは、金融金額に浮動小数点型を使うことに警鐘を鳴らしています。一般的なパーサーやランタイムは、他の部分が慎重に作られていても、境界で丸め誤差を持ち込むことがあるからです。システムが残高を保持するのか、レートを計算するのか、暗号資産を扱うのかに応じて、固定の最小単位、任意精度の小数、有理数、あるいはそれらの組み合わせを使うようチームに勧めています。

この区別は重要です。$12.34 の法定通貨残高は、ISO 4217 の通貨メタデータの下では 1,234 セントとして表せるかもしれません。暗号トークンは 18 桁の小数を使い、64 ビット整数をオーバーフローさせるかもしれません。生の JSON 数値は、クライアントがそれを IEEE 754 の double として解析すると、慎重に設計された内部表現を台無しにしてしまうことがあります。そこでハンドブックは、金額を文字列か最小単位の整数で送るようエンジニアに促しています。

このガイドは、丸めを整形上の問題ではなく、業務上の意思決定として扱っています。手数料計算、通貨変換、利息、レート適用はいずれも、システムが配分しなければならない端数を生みます。チームは、余りを誰が受け取るか、誰が失うかを決め、残差を記録し、永続化や表示のような境界まで丸めを遅らせる必要があります。プラットフォームが 1 件の支払いを複数の部分に分割する場合、丸め後の部分の合計が元の金額に戻らないことがあります。ハンドブックは、その差分を隠すのではなく追跡するよう促しています。

台帳の章は、このハンドブックの中心を成しています。ガイドは複式簿記をエンジニアリングのパターンとして説明しています。各移動は 1 つの勘定を貸方にし、別の勘定を借方にすることで、金銭に出所と行き先が生まれます。外部プロバイダーも勘定として扱われます。ユーザー残高は、変更可能な残高フィールドではなく仕訳から導かれます。修正は、既存レコードを編集するのではなく、関連づけられた新しいエントリで行われます。

このアプローチは監査人にたどれる記録を与えます。金融システムは、何が起きたのか、誰が引き金を引いたのか、システムがいつ計上したのか、なぜ起きたのか、どのソースデータが判断を支えたのかを説明できなければなりません。ハンドブックは、価値の時刻、記帳時刻、決済時刻を分けて扱います。なぜなら、それぞれが異なる問いに答えるからです。カード取引は月曜日に発生し、火曜日に会社のシステムへ入り、金曜日に銀行へ決済されるかもしれません。これらの日付を 1 つの created_at フィールドにまとめると、後から再構成できない事実を失います。

ハンドブックはイベントソーシングも慎重に扱います。イベントログが派生状態のソースになるため、イベントソーシングは強力な監査証跡をチームに与えられます。しかし、ガイドはそれを万能の答えとして売り込んではいません。エンジニアは依然として、投影、スナップショット、スキーマ進化、そして何年も生き残る必要のある古いイベントへの対応手段を必要とします。周辺の多くの領域では、信頼できる変更ログを備えた従来型モデルで、より少ない運用コストで要件を満たせるとハンドブックは述べています。

実行パターンもガイドの大きな部分を占めています。フィンテックのシステムは設計上リトライを行うため、冪等性には特に注意が払われます。出金リクエストは、プロバイダーが受け取った後にタイムアウトするかもしれません。クライアントは再試行します。サーバーは、それらの送達を 1 つの効果にまとめなければなりません。ハンドブックは、クライアントと操作にスコープされた明示的な冪等キーと、同時に 2 件の重複リクエストが到着した場合に対応する原子的な防護策を推奨しています。

資金の予約は別の競合を扱います。プラットフォームが送金したり、コンプライアンスプロバイダーを呼び出したりする前に、ユーザーの利用可能残高に対して必要額を予約します。資金は依然としてユーザーのものである一方、システムは別の取引が同じ金額を使うことを防ぎます。ガイドは 1 つの厳格な要件を明確にしています。残高の確認と予約の記録には強い整合性が必要です。古い読み取りによって、同じ資金に対して 2 件の出金が通ってしまう可能性があります。

ハンドブックは、予約が残高不足をなくすとは言いません。外部システムは、予想を上回る決済、取消し、チャージバック、遅延手数料によって、残高をマイナスにすることがあります。ガイドは、非負の残高を符号なし型や、現実を拒否するデータベース制約で表現しないようエンジニアに警告しています。マイナス残高を表現できないシステムは、クラッシュするか、値を 0 に丸めるか、壊れた修復経路でお金を造ってしまう可能性があります。ハンドブックは、チームに対して、当座貸越を記帳し、調査し、将来の入金、返済、または損失勘定によって回収するよう勧めています。

外部連携も同じ不信の対象です。決済プロセッサ、銀行、カストディアン、KYC ベンダー、AML ベンダー、ブロックチェーンノード、内部サービスはいずれも、壊れたペイロード、古い記録、重複メッセージ、あるいは無応答を返すことがあります。ハンドブックは、依存するフィールドを検証し、リクエストとレスポンスを検索可能な形式で保存し、トラフィックが制限に触れる前にベンダーの上限に対して概算計算を行うよう勧めています。

Webhook は率直に扱われています。Webhook は事実を確定するものではなく、確認を促すものです。ガイドは、元のバイト列に対して署名を検証し、生のペイロードを保存し、素早く応答を返し、作業をリクエスト経路の外で処理することを推奨しています。チームは、プロバイダーの API に問い合わせて現在状態を確認し、届かない webhook のための照合ジョブを構築すべきです。同じイベントが 2 回届くことも、順序が前後することもあるため、Webhook ハンドラには冪等性と状態チェックが必要です。

ハンドブックは、このパターンを信頼できる発行にも結びつけています。データベースを更新し、Kafka イベントや外向きの webhook を別ステップで送信するシステムは、その 2 つの間で失敗する可能性があります。ガイドは、アウトボックスパターン、変更データキャプチャ、イベントソーシングを実用的な解として説明しています。DebeziumAWS Database Migration ServiceTemporalCamundaAWS Step Functions のようなツールがその領域の一部をカバーしますが、それぞれが独自のモデルと運用負荷を伴います。

照合は最後の砦として機能します。ハンドブックは、チームに対して、自分たちの台帳をプロセッサ、銀行、カストディアン、ブロックチェーン、その他の独立したソースと比較するよう促しています。不一致は、データの欠落、金額の違い、古い決済、あるいは 1 対多の一括振替を意味するかもしれません。ガイドは、レポートを緑にするために片側を書き換えることに警鐘を鳴らしています。エンジニアには、第一級の修正、再処理経路、決済タイミングを尊重する突合ロジックが必要です。

制御の章では、会社内の従業員やシステムに対する不信という考え方を広げています。機微な資金操作、手数料変更、本番デプロイ、インフラ変更には、職務分掌や maker-checker 承認が必要になる場合があります。承認自体にも記録が必要です。申請者、承認者、理由、タイムスタンプ、そして同一人物が両方の役割を果たしていない証拠です。アクセス制御も同様に、最小権限、ロールベースアクセス、変更履歴、定期的なレビューを通じて扱われます。

テストの章では、例ベースの検証だけよりも金融状態に適した手法でハンドブックを締めくくっています。プロパティベーステストは、操作列を生成し、各ステップの後に帳簿が一致していることを確認できます。クラッシュ注入は、長時間実行されるフローの各ステップの間でプロセスを停止し、ワーカーが再開できることを証明できます。ゴールデンテストは、手数料内訳や明細をレビュー済み出力に固定できます。後方互換性テストは、スキーマ変更後も古いイベントペイロードを読み取れるよう保ちます。

ハンドブックのエンドツーエンド例は、これらのパターンを具体化しています。暗号資産の出金は、冪等な送信、資金予約、コンプライアンスチェック、オンチェーンへの送信、確認深度、台帳仕訳、手数料決済、チェーン照合を組み合わせています。カード入金は、capture webhook をシグナルとして扱い、クリアリング勘定を通じて入金し、決済を待ち、チャージバックを関連する反転で処理すべき理由を示しています。アプリ内のコンバージョンとキャッシュバックは、スプレッド、丸め、基準レート、プロモーション資金のすべてに台帳エントリが必要な理由を示しています。

このプロジェクトは、資金調達、投資家、商用ローンチを謳ってはいません。その市場での位置づけは別のギャップから来ています。多くのエンジニアは強い分散システムのスキルを持ってフィンテックに入りますが、会計、決済、カストディ、制裁チェック、チャージバック、監査証跡への露出はほとんどありません。このハンドブックは、それらの論点を金融の伝承ではなくソフトウェアパターンとしてまとめています。

そのため、このガイドはフィンテックのスタートアップを超えて有用です。残高を保存する、資産を移動する、プロモーション資金をクレジットする、金融レポートを出力する、決済プロバイダーと連携する、といったあらゆるチームが同じ圧力にさらされます。お金のソフトウェアは、サービス、タイムスタンプ、リトライ、人による上書きの間にできる隙間で壊れます。このハンドブックは、エンジニアにその隙間を表す語彙と、コードに落とし込める制御手段を与えています。

コメント

コメントを読み込み中...