イベント駆動設計
limはイベント駆動アーキテクチャを採用しています。すべての会計処理は、外部から流入するイベントをトリガーとして実行されます。
アーキテクチャ概要
┌──────────────────────┐
│ Event Sources │
│ Bank API │ Webhook │
│ MCP Tool │ Manual │
└──────────┬───────────┘
▼
┌──────────────────────┐
│ Event Queue │
│ PG LISTEN/NOTIFY │
│ + event table │
└──────────┬───────────┘
▼
┌──────────────────────┐
│ Judgment Engine │
│ Rule → History → AI │
└──────────┬───────────┘
▼
┌──────────────────────┐
│ Journal Entries │
│ Audit-logged ledger │
└──────────┬───────────┘
▼
┌──────────────────────┐
│ Real-time Queries │
│ TB │ PL │ BS │ CF │
└──────────────────────┘
イベントの流れ
1. イベントの取込
外部システムからイベントを受信します:
{
"type": "bank_transaction",
"source": "mizuho_api",
"data": {
"date": "2026-03-15",
"amount": -11000,
"description": "カ)エーダブリユーエス",
"balance": 2389000
}
}
2. イベントの正規化
取込まれたイベントは共通フォーマットに正規化されます:
{
"id": "evt_01J7...",
"type": "expense",
"vendor": "AWS",
"amount": 11000,
"currency": "JPY",
"date": "2026-03-15",
"payment_method": "bank_transfer"
}
3. Judgment Engineによる処理
正規化されたイベントがJudgment Engineに渡され、仕訳が生成されます。
4. 仕訳の記帳
生成された仕訳がレジャーに記帳され、すべての財務データがリアルタイムに更新されます。
PG LISTEN/NOTIFY
limはPostgreSQLの LISTEN/NOTIFY をイベントバスとして使用します。シンプルさと信頼性を両立する設計です。
- NOTIFY: イベントがDBに挿入されると通知を発行
- LISTEN: ワーカーが通知を受信して処理を開始
- Polling fallback: 通知を取りこぼした場合のポーリング
外部のメッセージブローカー(Kafka、RabbitMQ等)は使いません。PostgreSQLだけで完結するため、インフラがシンプルです。
イベントグラフ
イベント間の因果関係をグラフとして記録します:
銀行取引(evt_01) → 仕訳作成(evt_02) → 残高更新(evt_03)
→ ルール学習(evt_04)
これにより、任意の仕訳について「なぜこの仕訳が作られたのか」を完全に追跡できます。
冪等性
同じイベントが複数回処理されても結果は変わりません。イベントIDによる重複検知が組み込まれています。
process(event) → journal_entry (1回目: 作成)
process(event) → no-op (2回目: スキップ)
次のステップ