juspay/hyperswitch
主な特徴
- **コスト可観性**: AIを活用した高度な可観性ツールで決済コストを監査、監視、最適化
- **収益回復**: カードBIN、地域、方法などで調整されたインテリジェントなリトライ戦略
- **Vault**: PCI準拠のVaultサービスでカード、トークン、ウォレット、銀行認証情報を保存
- **インテリジェントルーティング**: 最高の承認率を予測してPSPにトランザクションをルーティング
- **照合**: バックデートサポート付きの2-way/3-way照合の自動化
- **代替決済手法**: PayPal、Apple Pay、Google Pay、BNPLなどのドロップインウィジェット
- **モジュラーアーキテクチャ**: 必要な機能だけを選んで利用可能
- **Rustで構築**: パフォーマンスと信頼性を重視
リポジトリ解析: juspay/hyperswitch
基本情報
- リポジトリ名: juspay/hyperswitch
- 主要言語: Rust
- スター数: 22,893
- フォーク数: 3,894
- 最終更新: 高頻度に更新中
- ライセンス: Apache License 2.0
- トピックス: Payments Infrastructure、Open Source、Rust、Payment Router、Payment Orchestration
概要
一言で言うと
Hyperswitchは、Rustで書かれたモジュラー・オープンソースの決済インフラストラクチャで、企業が必要な機能だけを選んでカスタマイズできる決済ルーティングシステムです。
詳細説明
Hyperswitchは「決済のLinux」を目指して開発された商用オープンソースの決済スタックです。柔軟性と制御を重視したモジュラーアーキテクチャを採用し、既存の決済スタックに必要なモジュールだけを追加できるよう設計されています。ベンダーロックインや不要な複雑さを避け、各モジュールは独立して動作し、決済処理の異なる側面を最適化するように設計されています。Juspay社によって保守されており、400以上の大手企業の決済インフラをサポートしているチームが開発しています。
主な特徴
- コスト可観性: AIを活用した高度な可観性ツールで決済コストを監査、監視、最適化
- 収益回復: カードBIN、地域、方法などで調整されたインテリジェントなリトライ戦略
- Vault: PCI準拠のVaultサービスでカード、トークン、ウォレット、銀行認証情報を保存
- インテリジェントルーティング: 最高の承認率を予測してPSPにトランザクションをルーティング
- 照合: バックデートサポート付きの2-way/3-way照合の自動化
- 代替決済手法: PayPal、Apple Pay、Google Pay、BNPLなどのドロップインウィジェット
- モジュラーアーキテクチャ: 必要な機能だけを選んで利用可能
- Rustで構築: パフォーマンスと信頼性を重視
使用方法
インストール
前提条件
- DockerまたはPodman
- Git
- Docker Compose
- クラウドデプロイの場合:AWS/GCP/Azureアカウント
- Rust 1.80.0以上(ソースからビルドする場合)
インストール手順
# 方法1: Docker経由のローカルセットアップ(ワンクリック)
git clone --depth 1 --branch latest https://github.com/juspay/hyperswitch
cd hyperswitch
scripts/setup.sh
# 方法2: AWSへのクラウドデプロイ
# AWSコンソールでCloudFormationスタックを起動
# またはHelmチャートを使用
# 方法3: Docker Composeでの詳細設定
docker-compose -f docker-compose.yml up -d
基本的な使い方
Hello World相当の例
# 決済の作成(シンプルなカード決済)
curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: YOUR_API_KEY' \
--data '{
"amount": 1000,
"currency": "USD",
"payment_method_data": {
"card": {
"card_number": "4242424242424242",
"card_exp_month": "12",
"card_exp_year": "25",
"card_holder_name": "John Doe",
"card_cvc": "123"
}
}
}'
実践的な使用例
// Node.js SDKを使用した決済処理
const hyperswitch = require('@hyperswitch/node');
const client = hyperswitch.Client({
apiKey: process.env.HYPERSWITCH_API_KEY,
baseUrl: 'https://api.hyperswitch.io'
});
// コネクターの設定
await client.merchantConnectorAccounts.create({
connector_name: 'stripe',
connector_account_details: {
auth_type: 'HeaderKey',
api_key: process.env.STRIPE_SECRET_KEY
},
payment_methods_enabled: [
{ payment_method: 'card' },
{ payment_method: 'wallet', payment_method_types: ['apple_pay', 'google_pay'] }
]
});
// ルーティングルールの設定
await client.routingAlgorithm.create({
name: 'smart_routing',
description: 'Route based on success rate',
algorithm: {
type: 'priority',
data: [
{ connector: 'stripe', priority: 1 },
{ connector: 'adyen', priority: 2 }
]
}
});
高度な使い方
// Rustでのカスタムコネクター実装
use hyperswitch_interfaces::api::{ConnectorIntegration, Payment};
use hyperswitch_domain_models::router_data::RouterData;
#[derive(Debug, Clone)]
pub struct CustomConnector;
#[async_trait::async_trait]
impl ConnectorIntegration<api::Authorize, types::PaymentsData, types::PaymentsResponseData>
for CustomConnector
{
async fn execute_pretasks(
&self,
_router_data: &mut RouterData<api::Authorize, types::PaymentsData, types::PaymentsResponseData>,
_connectors: &settings::Connectors,
) -> CustomResult<(), errors::ConnectorError> {
Ok(())
}
async fn get_headers(
&self,
req: &types::PaymentsAuthorizeRouterData,
_connectors: &settings::Connectors,
) -> CustomResult<Vec<(String, request::Maskable<String>)>, errors::ConnectorError> {
let mut headers = vec![
("Content-Type".to_string(), "application/json".to_string().into()),
];
// Add authentication headers
Ok(headers)
}
async fn get_url(
&self,
_req: &types::PaymentsAuthorizeRouterData,
connectors: &settings::Connectors,
) -> CustomResult<String, errors::ConnectorError> {
Ok(format!("{}/payments", connectors.custom.base_url))
}
// Implement other required methods...
}
ドキュメント・リソース
公式ドキュメント
- README.md: プロジェクト概要、クイックスタートガイド、アーキテクチャ
- docs/: 貢献ガイドライン、セキュリティポリシー、RFCなど
- 公式ドキュメントサイト: https://docs.hyperswitch.io
- APIリファレンス: api-reference/ディレクトリ内にOpenAPI仕様
サンプル・デモ
- ホステッドサンドボックス: https://app.hyperswitch.io(セットアップ不要)
- Postmanコレクション: postman/ディレクトリ
- ビデオチュートリアル: Dockerを使用したローカルセットアップ
チュートリアル・ガイド
- コントロールセンターの使い方
- コネクターの設定方法
- 決済テストの実施方法
- Helmを使ったKubernetesへのデプロイ
- Slackコミュニティ: https://inviter.co/hyperswitch-slack
技術的詳細
アーキテクチャ
全体構造
Hyperswitchはマイクロサービスアーキテクチャを採用し、モジュラーでスケーラブルな設計になっています。コアのルーターサービスを中心に、各種決済モジュールが独立して動作します。データストアにはPostgreSQL、キャッシュとストリーミングにはRedis、非同期タスクにはKafkaを使用しています。
ディレクトリ構成
hyperswitch/
├── crates/ # Rustクレートのモノリポ
│ ├── router/ # メインのルーターアプリケーション
│ ├── api_models/ # APIモデル定義
│ ├── diesel_models/ # データベースモデル
│ ├── hyperswitch_connectors/ # コネクター実装
│ ├── analytics/ # 分析機能
│ ├── payment_methods/ # 決済手法管理
│ └── storage_impl/ # ストレージ実装
├── config/ # 設定ファイル
├── api-reference/ # APIドキュメント
├── cypress-tests/ # E2Eテスト
└── docker/ # Docker設定
主要コンポーネント
-
Router: メインのルーティングエンジン
- 場所:
crates/router/ - 依存: actix-web、diesel、redis
- インターフェース: REST API、gRPC
- 場所:
-
Connectors: 決済ゲートウェイ統合
- 場所:
crates/hyperswitch_connectors/ - 依存: hyperswitch_interfaces
- インターフェース: ConnectorIntegration trait
- 場所:
-
Analytics: 分析エンジン
- 場所:
crates/analytics/ - 依存: clickhouse、opensearch
- インターフェース: メトリクスAPI、レポートAPI
- 場所:
-
Storage: データベース抽象化層
- 場所:
crates/storage_impl/ - 依存: diesel、redis_interface
- インターフェース: 非同期CRUD操作
- 場所:
技術スタック
コア技術
- 言語: Rust 1.80.0以上(安全性とパフォーマンスを重視)
- フレームワーク:
- Actix-web 4.11(高性能Webフレームワーク)
- Diesel 2.2(ORM)
- Tokio(非同期ランタイム)
- 主要ライブラリ:
- bb8 (0.8): データベースコネクションプール
- rdkafka (0.36): Kafkaクライアント
- reqwest (0.11): HTTPクライアント
- jsonwebtoken (9.3): JWT認証
- openssl (0.10): 暗号化
開発・運用ツール
- ビルドツール:
- Cargo(Rust標準)
- Dockerマルチステージビルド
- Nix(再現可能なビルド環境)
- テスト:
- 単体テスト: Rust標準テスト
- 統合テスト: Cypress
- APIテスト: Postman/Newman
- CI/CD:
- GitHub Actions
- バッジ: CI status、License
- デプロイ:
- Docker Compose(ローカル)
- Helm Charts(Kubernetes)
- AWS CloudFormation
- CDKスクリプト
設計パターン・手法
- モジュラーアーキテクチャ: 各決済機能が独立したモジュールとして実装
- traitベースの抽象化: Rustのtraitを使用したコネクター抽象化
- イベント駆動アーキテクチャ: Kafkaを使用した非同期処理
- CQRSパターン: 読み取りと書き込みの分離(master/replica DB)
- キャッシュファースト: Redisを使用したアグレッシブキャッシング
データフロー・処理フロー
-
決済リクエスト受信:
- API Gatewayで認証・認可
- リクエストバリデーション
- マーチャント設定の取得(Redisキャッシュ)
-
ルーティング決定:
- ルーティングアルゴリズムの実行
- 成功率・コスト・レイテンシーを考慮
- 最適なPSPの選択
-
コネクター処理:
- 選択されたPSPのコネクター呼び出し
- リクエスト/レスポンスの変換
- エラーハンドリングとリトライ
-
レスポンス処理:
- トランザクションの保存(PostgreSQL)
- イベントの発行(Kafka)
- Webhookの送信
- クライアントへのレスポンス
API・インターフェース
公開API
Payments API
- 目的: 決済の作成、確認、キャンセル
- 使用例:
// POST /payments
{
"amount": 1000,
"currency": "USD",
"capture_method": "automatic",
"payment_method": {
"type": "card",
"card": {
"number": "4242424242424242",
"exp_month": "12",
"exp_year": "2025",
"cvc": "123"
}
},
"routing": {
"type": "single",
"data": {"connector": "stripe"}
}
}
Routing API
- 目的: ルーティングルールの管理
- エンドポイント:
/routing,/routing_algorithm
設定・カスタマイズ
設定ファイル
# config.toml
[server]
port = 8080
host = "127.0.0.1"
shutdown_timeout = 30
[master_database]
username = "db_user"
password = "db_pass"
host = "localhost"
port = 5432
dbname = "hyperswitch_db"
[redis]
host = "127.0.0.1"
port = 6379
pool_size = 5
[key_manager]
url = "http://localhost:5000"
拡張・プラグイン開発
- カスタムコネクター:
ConnectorIntegrationtraitを実装 - ルーティングアルゴリズム: カスタムアルゴリズムの実装
- Webhookハンドラー: イベントハンドラーのカスタマイズ
- フィーチャーフラグ: Cargo featureで機能の有効/無効化
パフォーマンス・スケーラビリティ
パフォーマンス特性
- レイテンシー: <100msのAPIレスポンスタイム(キャッシュヒット時)
- スループット: 数万TPSをサポート
- 最適化手法:
- Rustのゼロコスト抽象化
- Redisキャッシュの積極的活用
- 非同期I/O
- コネクションプーリング
スケーラビリティ
- 水平スケーリング: ステートレス設計により簡単にスケールアウト
- データベース: 読み取りレプリカによる負荷分散
- キャッシュ: Redisクラスタによる高可用性
- 非同期処理: Kafkaを使用したイベントストリーミング
制限事項
- メモリ使用量: Rustのmimallocアロケータを使用して最適化
- データベース: PostgreSQLが必須(他DBサポートなし)
- コネクター数: 現在約40以上のコネクターをサポート
- 地域制限: 一部の決済手法は特定地域のみ
評価・所感
技術的評価
強み
- 完全なオープンソース: Apache 2.0ライセンスで商用利用も可能
- モジュラーアーキテクチャ: 必要な機能だけを選択できる柔軟性
- Rustによる高性能: メモリ安全性とパフォーマンスの両立
- 豊富なコネクター: 40以上の決済ゲートウェイをサポート
- エンタープライズ級の実績: Juspayの400社以上の企業での実績
- 充実したモニタリング: コスト可観性、分析、レポート機能
改善の余地
- 学習曲線: Rustの知識が必要で、カスタマイズには技術力が必要
- ドキュメント: 一部の高度な機能のドキュメントが不足
- エコシステム: SDKやプラグインの数がまだ少ない
- データベースサポート: PostgreSQL以外の選択肢がない
向いている用途
- マルチPSP管理: 複数の決済ゲートウェイを使い分けたい企業
- コスト最適化: 決済コストを細かく分析・最適化したい企業
- カスタマイズ重視: 独自のルーティングロジックを実装したい企業
- グローバル展開: 多様な決済手法を必要とする国際的なビジネス
- ベンダーロックイン回避: オープンソースで決済システムをコントロールしたい企業
向いていない用途
- 小規模事業: 単一PSPで十分な小規模ビジネス
- 技術リソース不足: Rustエンジニアがいない組織
- シンプルな要件: 基本的な決済機能だけで十分な場合
- SaaS希望: マネージドサービスを望む場合(セルフホストが前提)
総評
Hyperswitchは、「決済のLinux」というビジョンを体現した優れたオープンソース決済インフラストラクチャです。モジュラーアーキテクチャによる柔軟性、Rustによる高性能、豊富な機能セットが特徴で、企業の決済システムに必要なすべてを提供しています。
特に、コスト可観性、インテリジェントルーティング、収益回復などの高度な機能は、単なる決済ゲートウェイを超えた価値を提供します。Juspayの実績に裏打ちされた信頼性と、オープンソースコミュニティによる継続的な改善が、このプロジェクトの強みです。ただし、Rustの技術力が必要な点が導入のハードルとなる可能性があります。