SDKの設計と言語サポート
1) SDKの目標と成功基準
Developer Experience (DX):直感的なAPI、言語間の統一的な意味論。
信頼性:タイムアウト/リトリート/ボックス外のidempotency。
セキュリティ:秘密、署名、TLS、 proksi/企业環境との互換性。
Observability:ログ、メトリック、言語の標準ツールのトレース。
経済:最小出力/CPU、効果的なページネーション、バッチ。
安定性:厳密なsemver、後方互換性、LTSの枝。
2)建築の原則
1.シンクライアント、強力な契約:SDKラッパーオーバープロトコル(REST/gRPC)、非表示のビジネスロジックなし。
2.統一されたサーフェス:同じ概念(クライアント、リクエスト、レスポンス、エラー、ペジネーター、WebhookVerifier)。
3.デフォルトで安全:合理的なタイムアウト、指数関数バックオフ+ジッタ、繰り返し保護。
4.Config layering: ENV→config file→constructor→メソッドパラメータ。
5.プラグイン可能なトランスポート:HTTP/gRPCは取り外し可能で、接続proksi/池と互換性があります。
6.テスト可能性:インターフェイス/偽物、依存性の注入、記録再生。
7.エラーI18n: machine 'error_code'は安定です。メッセージはローカライズ可能です。
8.アクセシビリティ:必要に応じて非同期バリアント(通常は'AsyncClient')。
9.Security-first:必要に応じて、秘密はログ、PIIエディション、FIPS互換の暗号ライブラリに分類されません。
3)サポートテーブルおよび機会のパリティ
4) APIベースサーフェス(正規モデル)
共通エンティティ
クライアント:トランスポート、キー、レトレイ、テレメトリーフックの設定。
Request/Response: type-safe models/DTO、 pagination/cursors。
エラー:'status'、 'error_code'、 'trace_id'、 'retriable'を持つ単一のクラス。
Paginator/Iterator:ページ/カーソルの遅延検索。
WebhookVerifier: HMAC/mTLSチェック、dedup by 'event_id'。
ミニサンプル(TypeScript)
ts const client = new GambleHubClient({
apiKey: process. env. GH_API_KEY!,
timeoutMs: 10_000,
retries: { max: 5, strategy: "expo-jitter" }
});
const { items, nextCursor } = await client. reports. list({ from, to, cursor });
for await (const report of client. reports. iter({ from, to })) { /... / }
ミニサンプル(Python、 async)
py from gamblehub import AsyncClient, WebhookVerifier
client = AsyncClient(api_key=API_KEY, timeout=10, retries={"max":5})
async for user in client. users. iter(updated_after=ts):
...
verifier = WebhookVerifier(secret=WEBHOOK_SECRET)
if verifier. verify(headers, body): ack()
5)構成およびランタイム
ENV: 'GH_API_KEY'、 'GH_ENDPOINT'、 'GH_TIMEOUT_MS'、 'HTTP_PROXY/HTTPS_PROXY'、 'GH_REGION'。
Constructor-Overrides ENV。
コールごとのオーバーライド:メソッドレベルのタイムアウト/リトレイ。
TLS/mTLS:証明書/キーへのパス。必要に応じてCAをピン留めします。
接続プール:keep-alive、 HTTP/2、 concurrency constraint。
6)箱からの安全
秘密:ログを記録しない、スタックトレースで非表示にする。redaction"。
署名:Webhook用のHMAC、 'X-Key-Id '/key rotation、 "two keys' active/nextのサポート。
Idempotency:書き込み操作のための'Idempotency-Key'の透過的な設定(再起動は安全です)。
RBAC/スコープ:スコープのための便利な列挙/定数。
PIIポリシー:ロギングのための標準的な編集インターフェイス。
7)信頼性: タイムアウト、リトリート、バック
デフォルトのタイムアウト:10-15s;接続3-5s。
レトライ:5xx/408/429 (respect 'Retry-After')、指数関数バックオフ+ジッタ、再試行/時間制限。
回路遮断器:SDK(またはサードパーティのlib勧告)でオプション。
Idempotent書き込み: キーによる自動リピート;衝突→上昇'409。IDEMP_REPLAY'
8)ページネーション、カーソル、ストリーミング
カーソル/イテレータ:遅いブルートフォース、過渡エラーの自動リピート。
キーセットのページネーション:安定した順序'(updated_at,id)'。
Backpressure:同時リクエストの制限;-async-SDK-'チャンネル'の非同期。
ストリーミング(利用可能な場合):SSE/WebSocket/gRPCストリーム、自動再接続と'シーケンス'による重複除外。
9)間違いと契約
単一の階層:- 「ApiError」→「AuthError (401)」、 「PermissionError (403)」、 「NotFound (404)」、 「Conflict (409)」、 「RateLimit (429)」、 「ValidationError (429)」'422)'、 'ServerError (5xx)'。
- Category: 'status'、 'error_code'、 'message'、 'trace_id'、 'retriable'、 'details'。
- ベストプラクティス:メッセージは人間が読みやすく、'error_code'は安定しています。
10)言語イディオム
TypeScript/JS
ペジネーションのためのPromiseベースの+ジェネレータ。ESM+CJSパケット。
ツリーシェイク、最小ポリファイル、アボート信号('AbortController')。
Python
Sync+Async (aiohttp/httpx)、コンテキストマネージャ、'pydantic'モデル(またはデータクラス)。
Linux/macos/windowsの車輪;proxies/NO_PROXYサポート。
Java
'CompleteFuture'(必要に応じて)、'AutoCloseable'、 'Duration'、 'Executor'。
HTTPクライアント:'java。ネット。http'またはOkHttp;ログをSLF4Jします。
Go
コンテキストのコンテキスト。コンテキスト'、'http。TransportをチューニングしたClient、テスト用インターフェース。
ラッピング中にエラーが発生しました('fmt。Errorf(「%w」、 err)')、エラーの意味論。
。NET
'HttpClientFactory'、 'CancellationToken'、 'IAsyncEnumerable <T>'。
Pollyポリシー(再試行/サーキットブレーカー)。
...PHP/Ruby (PSR-18、 Faraday/Net:: HTTP)など。
11)ログ、メトリック、トレース
ログ:レベル(ERROR/WARN/INFO/DEBUG)、相関'trace_id'、機密データを無効にします。
'requests_total'、 'errors_total {status}'、 'retry_count'、 'latency_ms'、 'throttled_total'。
トレース:OpenTelemetryフック(API呼び出し、エンドポイント、ステータス、再試行属性へのスパン)。
デバッグモード:環境変数'GH_SDK_DEBUG=1'-HTTPヘッダ(シークレットなし)と時刻を印刷します。
12)ドキュメントと例
クイックスタート5分:認証、最初の要求、ページネーション、429処理。
クックブック:webhooks(署名検証)、idempotent書き込み、再生。
APIリファレンス:OpenAPI/Protobufから自動生成されますが、「手動」の例があります。
スニペット:一般的なタスク(Python/TS/Java/Go/。NET)の既製のコード。
13)生成と手動コーディング
組み合わせたアプローチ:codegen(モデル/クライアント)+人間工学/idempotency/paginatorsのための手動「ペン」。
テンプレート:ユニフォームメソッド名('create/get/list/update/delete')、 stab。署名します。
regen (CI-gate)の後に「diff-compatibility」をチェックします。
14)バージョン管理、互換性および廃止
SemVer: X。Y。Z。ブレイキング-メジャーのみ。
安定性ポリシー:マイナーリリース-フィールド/メソッドを追加し、契約を変更しません。
廃止:注釈/属性@廃止/廃止、プロセスごとに1回のランタイム警告、ウィンドウ≥ 90日。
LTSブランチ:critfixesのバックポート(新機能はありません)。
15)リリースとサプライチェーン
CI/CD: linters/formatters、 unit+integration、 contract tests、 e2e vs。 sandbox。
アーティファクト署名:Sigstore/GPG、リリースのチェックサム。
出版:npm/PyPI/Maven/NuGet/Go/Composer/RubyGemsとchangelogとリリースノート。
SemVer gate:公開APIの互換性を自動チェックします(例えば、'apiregistry diff')。
16)テスト(質のマトリックス)
ユニット:モデル、シリアライズ、検証、リトレイ/タイムアウト。
契約:OpenAPI/Protobufスキームに対する(負/エッジケース)。
統合:対サンドボックス(idempotency、 429/5xx、 webhooks)。
Load/soak: pagination/stream、 backpressure。
Fuzz:フィールド/ヘッダー/時間境界。
Compat-古いSDKは新しいAPIを↔し、その逆も同様です。
スモークパック:CIで回帰をキャッチする5分。
17)テレメトリーとプライバシーポリシー
optional-opt-in: PIIなしで集約されたSDKメトリクス(バージョン、言語、ステータス)のコレクション。
設定:'telemetry: off' anonymous 'full'(デフォルトはoff/anonymous)。
透明性:何が起こるか、そしてその理由を文書化する。切断ボックスをチェックしてみましょう。
18)パフォーマンスとFinOps
バッチ:小さなクエリを組み合わせます。RPSを制限します。gzip/br。
ETag/If-None-Matchキャッシュ、条件付きGET。
経済的なモデル:メモリにすべてをロードする代わりに怠惰なイテレータ。
APIを「DDOS」しないように、制限付きの並行処理: 'max_concurrency'
19)典型的なSDKの部品(スケルトン)
エラー(TypeScript)
ts export class ApiError extends Error {
constructor(
readonly status: number,
readonly errorCode: string,
readonly traceId?: string,
readonly retriable?: boolean,
readonly details?: unknown
) { super(`${status} ${errorCode}`); }
}
Paginator (Python)
py class Paginator(Generic[T]):
def __init__(self, fetch_page):
self._fetch = fetch_page self._cursor = None async def __aiter__(self):
while True:
page = await self._fetch(self._cursor)
for item in page. items:
yield item if not page. has_more: break self._cursor = page. next_cursor
WebhookVerifier (Go)
go func Verify(body []byte, signatureHeader, secret string) bool {
parts:= strings. SplitN(signatureHeader, "=", 2)
mac:= hmac. New(sha256. New, []byte(secret))
mac. Write(body)
expected:= base64. StdEncoding. EncodeToString(mac. Sum(nil))
return hmac. Equal([]byte(parts[1]), []byte(expected))
}
20)サポート、SLAおよびコミュニティ
SDKによるSLA:重要なバグ-ETA、通信チャネル、互換性マトリックス(SDK↔API)を修正します。
課題テンプレート:バグ/機能/質問、言語/バージョンによる自動トリアージ。
ロードマップ/ラベル:「good first issue」、 「help wanted」。
セキュリティポリシー:'セキュリティ。md'、脆弱性を報告するためのチャネル、必要に応じてCVE。
21) SDK品質チェックリスト
- シングルモデルエラー('status'、 'error_code'、 'trace_id'、 'retriable')。
- タイムアウト/リトリート/ジッタ、'Retry-After'の尊重。
- Idempotency write、自動'Idempotency-Key'。
- カーソルページネーション、遅延イテレータ/ストリーム。
- HMAC/mTLSと重複排除を備えたWebhookVerifier。
- ENV/constructor/parametersによる設定。
- ロギング/メトリクス/OTelフック、秘密のないデバッグモード。
- SemVer、 ≥ 90日の減算、LTS分岐。
- 人気のタスクの完全な例とクックブック。
- CIにおける言語間の特徴パリティ行列。
22)実施計画(3回繰り返し)
1.MVP (2-3週間):基本クライアント、認証、3-5キーエンドポイント、ページネーション、シングルエラーモデル、レトライ/タイムアウト;TS+Python。
2.スケール(3-5週間):Java/Go/。NET、 WebhookVerifier、 idempotency write、テレメトリーフック、OpenAPIからモデルを生成します。
3.Pro(連続):ストリーミング/SSE/gRPC、 perf最適化、LTSブランチ、拡張クックブック、移行/削除ツール。
23) ミニFAQ
すべてを生成するか、あなたの手で書く?
モデル/クライアント、および人間工学(ペジネーター、リトレイ、idempotency、便利な署名)を手動で生成します。
別のasync-SDKが必要ですか?
Python-Python ('AsyncClient');JSで-デフォルトで;v。NET/Java-可能であれば非同期コール。
どのように言語のパリティを維持するには?
CIのマトリックス機能は「、ベルト」(TS→Py→Java→Go→。NET)を「遅れている」自動レポートでリリースします。
合計
強力なSDKは、単一のサーフェス、信頼性の高いデフォルト、およびすべての言語で同じ予測可能な契約です。開発者に安全な設定、わかりやすいエラーモデル、Webhookの便利なページネーションと検証を提供し、高品質のドキュメントと厳格なsemverでこれを完了させます。その後、統合は速く、サポートは安く、エコシステムは持続可能でスケーラブルになります。