Vinicius Aguiar

エンジニアリング

本番環境で設計・運用したシステム — アーキテクチャ判断、トレードオフ、実際の制約。

本番環境で解決した問題

フロントエンドパフォーマンス

B2B SaaSのインボックスが約20,000件の会話を一度に読み込み(リクエストあたり約6.7MB) — カーソルベースのページネーション + リスト仮想化で約19KBのペイロードにし、UIフリーズを解消

APIレイテンシ

マーケットプレイスAPIのタイムアウトがドロップシッピング事業のチェックアウトでカスケード障害を発生 — フォールバックと監視を備えたサーキットブレーカーで解決(実装の詳細はブログに)

マーケットプレイスの不整合

Mercado LivreとShopeeのAPIが不整合な商品データを返す問題 — アダプターパターンで両スキーマを統一モデルに正規化

レガシーマイグレーション

5万人以上が利用するエステ向けプラットフォームをPHP 5.3のモノリスからReact + Next.jsへダウンタイムなしで移行 — 画面単位の段階的移行(strangler fig)

スケール時のパフォーマンス

Web + モバイルのヘルスケアプラットフォームでユーザー増加に伴い応答時間が劣化 — クエリ最適化、戦略的キャッシング、並列呼び出しで解決

クロスプラットフォームUX

同一プロダクト内でReact(Web)とReact Native(モバイル)のUXを一貫させる — デザイントークンとコンポーネント契約を共有

データの一貫性

ペットショップ向けSaaSの財務モジュール(販売 + 手数料 + 決済)の同期ずれ — PostgreSQLのアドバイザリロックによるアトミックトランザクションで解決

本番環境のAIシステム

チャットボットではなく — AIがより大きなシステムの一部として機能する本番パイプライン。フォールバック、モニタリング、実データの流れを伴う。

WhatsApp上のAIエージェント

顧客対応、商品推薦、販売完了のためのLLMエージェント。メッセージは非同期で処理され、データはPostgreSQLに保存。LLMが利用できない場合はルールベースのマッチングにフォールバック。

RAGパイプライン(LangChain + pgVector)

ドキュメント取り込み → チャンキング → 埋め込み生成 → pgVectorによるPostgreSQLへのベクトル保存 → top-Kの意味検索結果をLLMのコンテキストとして使用。

実装の詳細を読む →

よくある質問

カーソルベースのページネーションとは何ですか?いつ使うべきですか?

OFFSET/LIMITの代わりに、各ページはカーソル — 最後に読み込んだレコードへの安定したポインタ(例:created_at + id)— から取得します。大きなリストでも読み取りコストが一定に保たれ、ナビゲーション中に新しいレコードが追加されても項目の重複や抜けを防げます。フィードやインボックスに最適な選択です。トレードオフは任意のページへ直接ジャンプできなくなることです。

マルチテナントアーキテクチャとは何ですか?

複数の組織が同じアプリケーションとデータベースを共有しながら、各テナントのデータは分離される設計パターンです。最近のSaaSで最も一般的なアプローチは、tenant_id カラムを持つ共有データベースと、セーフティネットとしての PostgreSQL の Row Level Security(RLS)です。

決済Webhookを信頼性高く処理するには?

多層的なアプローチを使います:すべてのイベントで署名を検証し、保存したイベントIDで冪等性を担保し、即座にackを返してバックグラウンドで処理し、ステートマシンで状態遷移を検証し、定期的な照合ジョブを実行し、失敗したイベントはデッドレターキューへ振り分けます。

本番システムにAIを統合するには?

AIを単独の機能ではなく、システムの一部として扱います。メッセージを非同期で処理し、データをデータベースへ書き戻し、LLMが利用できないときのフォールバックを実装し、応答品質を監視します。要点は信頼性です — AIプロバイダーに問題があってもシステムは動作し続けなければなりません。

サーキットブレーカーパターンとは何ですか?

サードパーティAPI連携のためのレジリエンスパターンです。外部APIが失敗し始めると、サーキットブレーカーが「開き」、障害をシステム全体に波及させる代わりにフォールバック応答を返します。クールダウン期間の後、サービスが回復したかを確認するためのテストリクエストを許可します。