GaiaExGaiaEx
エンタープライズ金融基盤のための Java
開発者プログラミング11 min read

エンタープライズ金融基盤のための Java

銀行・トレーディングインフラの多くを支える言語

投稿を共有

銀行がいまも JVM サービスを使い続ける理由

Java は取引記録・リスク管理・連携レイヤーでいまも一般的です。チームが運用の予測可能性、成熟したライブラリ、そして採用しやすい人材プールを重視するためです。唯一の選択肢ではありませんが、多くの金融機関ではデフォルトとなっています。

  • ポータビリティ — Linux サーバーでも開発者のノート PC でも同じバイトコードが動く。
  • ツール群 — 静的型は大規模なリファクタリングに役立ち、プロファイラーやデバッガーも成熟している。
  • エコシステム — Spring、メッセージングクライアント、JDBC、可観測性エージェントなど。

言語選定は組織的な問題です。コアとなる銀行システムでは、些細なマイクロベンチマークよりも保守性と人材確保のほうが優先されることが多いのです。

JVM のレイテンシとガベージコレクション

スループット志向のサービスは大きなヒープと良好な JIT ウォームアップを好みます。レイテンシに敏感な経路では、一時停止時間と割り当てレートが問題になります。現代的なコレクター(ZGC、Shenandoah、G1)はそれぞれ異なるトレードオフを目指しているので、一時停止の予算とハードウェアに応じて選びましょう。

# Examples only — validate flags for your JDK and workload
java -XX:+UseZGC -Xms8g -Xmx8g -jar service.jar
java -XX:+UseShenandoahGC -Xms8g -Xmx8g -jar service.jar

-Xms-Xmx に固定すると、取引時間中のリサイズによる余計な処理を避けられます。JIT の脱最適化がテール・レイテンシに悪影響を与える場合は、開始前にクリティカルパスをウォームアップしておきましょう。

JVM process (simplified) Heap (objects, arrays) Young / old generations depend on collector JIT compiled code Hot methods → native GC pauses / safepoints Tune allocation + collector
多くの取引サービスはテール・レイテンシを重視します。平均 CPU 使用率だけでなく、GC の一時停止も測定しましょう。

Spring Boot による API

Spring Boot は HTTP コントローラー、検証、セキュリティ、トランザクションをアノテーションで結び付けます。金融向け API では、それでも明示的な認可チェック、決済における冪等性、監査ログが必要です。フレームワークのデフォルト設定は業務ルールの代わりにはなりません。

@RestController
@RequestMapping("/api/v1/accounts")
public class AccountController {
    @GetMapping("/{id}/balance")
    public ResponseEntity<BalanceDto> balance(@PathVariable String id,
            @AuthenticationPrincipal UserDetails user) {
        if (!access.canRead(user, id)) {
            return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
        }
        return ResponseEntity.ok(service.balance(id));
    }
}

FIX とストリーミング

FIX は注文・約定メッセージにおいていまも一般的です。Java チームは QuickFIX/J やベンダー提供のブリッジをよく使います。並行するシステムでは、分析やリプレイのために Kafka などのログを通じて市場データや事後取引イベントをストリーミングします。

バックプレッシャーも設計に含めましょう。遅いコンシューマーがいても、セッションスレッドが無制限に崩壊してはいけません。

Event path: gateway → bus → services FIX session Exec reports Normalize IDs, timestamps Kafka topic Durable log Risk OMS Replay and ordering semantics must match your compliance story Exactly-once end-to-end is hard — design idempotency at boundaries
ログはプロデューサーとコンシューマーを分離します。正しさはスキーマとコンシューマーの側にあります。

並行性と耐障害性

I/O には上限付きのプールを使い、リスクの高い連携先はバルクヘッドで隔離し、不安定なダウンストリームにはサーキットブレーカーを設置しましょう。仮想スレッド(JDK 21 以降)は、OS スケールで1リクエスト1スレッドを使わずに構造化された並行パターンを実現できます。

リトライにはジッターと上限が必要です。そうしないと、負荷が集中して雪崩を起こしてしまいます。

JVM とオンチェーンクライアント

Web3j などのライブラリは、Java バックエンドから JSON-RPC エンドポイントを呼び出します。Hyperledger Besu や Corda は、エンタープライズネットワークにおける JVM の活用例です。統合作業自体はどこでも同じです。鍵の管理、nonce の処理、手数料市場、可観測性が課題になります。

GaiaEx はどの言語からでも利用できるトレーディング API を公開しています。Java は、その取引所呼び出しの周辺にあるオーケストレーション層やコンプライアンス層に適しています。