SDK-Design und Sprachunterstützung
1) SDK Ziele und Erfolgskriterien
Developer Experience (DX): Intuitive APIs, einheitliche Semantik zwischen den Sprachen.
Zuverlässigkeit: Timeouts/Retrays/Idempotenz „out of the box“.
Sicherheit: Geheimnisse, Signaturen, TLS, Kompatibilität mit proksi/企业 Umgebungen.
Beobachtbarkeit: Protokolle, Metriken, Tracks in Sprachstandardwerkzeugen.
Wirtschaft: Minimum egress/CPU, effektive Paginierung, Batchi.
Stabilität: strenger Semver, Abwärtskompatibilität, LTS-Zweige.
2) Architektonische Prinzipien
1. Thin Client, starke Verträge: SDK Wrapper über Protokoll (REST/gRPC), ohne versteckte Geschäftslogik.
2. Unified surface: gleiche Konzepte (Client, Request, Response, Error, Paginator, WebhookVerifier).
3. Safe by default: vernünftige Timeouts, exponentieller Backoff + Jitter, Schutz vor Wiederholungen.
4. Config layering: ENV → config-Datei → Konstruktor → Methodenparameter.
5. Pluggable Transport: HTTP/gRPC sind austauschbar, kompatibel mit proksi/池 Verbindungen.
6. Testfähigkeit: Schnittstellen/Fakes, dependency injection, record-replay.
7. I18n von Fehlern: Maschine' error _ code' ist stabil; Nachrichten sind lokalisierbar.
8. Zugänglichkeit: asynchrone Varianten (in der Regel 'AsyncClient'), wo relevant.
9. Security-First: Geheimnisse landen bei Bedarf nicht in Logs, PII-Revision, FIPS-konformen Krypto-Bibliotheken.
3) Unterstützungstabelle und Fähigkeitsparität
4) API-Basisfläche (kanonisches Modell)
Gemeinsame Einheiten
Client: Konfiguration von Transport, Schlüsseln, Retrays, Telemetrie-Hooks.
Request/Response: Typsichere Modelle/DTO, Pagination/Cursor.
Fehler: einzelne Klasse mit 'status', 'error _ code', 'trace _ id', 'retriable'.
Paginator/Iterator: Fauler Seitenwechsel/Cursor.
WebhookVerifier: HMAC/mTLS-Prüfung, Dedup durch 'event _ id'.
Mini-Beispiel (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 })) { /... / }
Mini-Beispiel (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) Konfiguration und Laufzeitumgebung
ENV: `GH_API_KEY`, `GH_ENDPOINT`, `GH_TIMEOUT_MS`, `HTTP_PROXY/HTTPS_PROXY`, `GH_REGION`.
Konstruktor: Definiert ENV neu.
Per-Call-Overrides: Timeout/Retrays auf Methodenebene.
TLS/mTLS: Pfad zum Zertifikat/Schlüssel, ggf. pinning CA.
Verbindungspools: Keep-Alive, HTTP/2, Begrenzung der Parallelität.
6) Sicherheit aus dem Karton
Geheimnisse: nicht protokollieren, in Stack-Spuren verstecken; redaction ``.
Signaturen: HMAC für Webhooks, 'X-Key-Id '/Schlüsselrotation, Unterstützung für „zwei Schlüssel“ aktiv/weiter.
Idempotenz: Transparente Installation des' Idempotency-Key 'für Write-Operationen (Neustart sicher).
RBAC/Scopes: praktische Aufzählungen/Konstanten für Scopes.
PII-Richtlinie: Standard-Bearbeitungsschnittstellen bei der Protokollierung.
7) Zuverlässigkeit: Timeouts, Retrays, Backoffs
Standard-Timeout: 10-15s; Anschluss 3-5c.
Retrays: für 5xx/408/429 (Respekt 'Retry-After'), exponentieller Backoff + Jitter, Limit Versuche/Zeit.
Circuit-Breaker: optional im SDK (oder Empfehlungen für Drittanbieter-Libs).
Idempotent Schreiben: automatische Wiederholung durch Schlüssel; Kollision → erhöhen '409 IDEMP_REPLAY'.
8) Paginierung, Cursor und Streaming
Cursor/Iterator: faule Overkill, Auto-Wiederholungen bei transienten Fehlern.
Keyset-Paginierung: Stabile Ordnung'(updated_at,id)'.
Backpressure: Begrenzung gleichzeitiger Anfragen; в async-SDK — `async for`/`channels`.
Streaming (wo verfügbar): SSE/WebSocket/gRPC-Stream mit Auto-Reconnect und Deduplex durch „sequence“.
9) Fehler und Vertrag
Einheitliche Hierarchie:- `ApiError` (базовый) → подтипы: `AuthError(401)`, `PermissionError(403)`, `NotFound(404)`, `Conflict(409)`, `RateLimit(429)`, `ValidationError(422)`, `ServerError(5xx)`.
- Свойства: `status`, `error_code`, `message`, `trace_id`, `retriable`, `details`.
- Best Practice: Nachrichten sind menschenlesbar, 'error _ code' ist stabil.
10) Sprachliche Idiome
TypeScript/JS
Promise-basierte + Generatoren für Pagination; ESM + CJS-Pakete.
Tree-shaking, minimale Polyphile, Abortsignale („AbortController“).
Python
Sync + Async (aiohttp/httpx), Kontext-Manager, 'pydantic' Modelle (oder dataclasses).
Wheels для linux/macos/windows; Unterstützung der proxies/NO_PROXY.
Java
„CompletableFuture“ (falls erforderlich), „AutoCloseable“, „Duration“, „Executor“.
HTTP client: `java. net. http 'oder OkHttp; SLF4J für die Protokolle.
Go
Kontexte' Kontext. Context`, `http. Client 'mit Tuned Transport, Schnittstellen für Tests.
Error wrapping (`fmt. Errorf („% w“, err)'), die Semantik der Sentinel-Fehler.
.NET
`HttpClientFactory`, `CancellationToken`, `IAsyncEnumerable<T>`.
Polly-Richtlinien (retry/circuit-breaker).
... usw. für PHP/Ruby (PSR-18, Faraday/Net:: HTTP).
11) Logging, Metriken, Tracing
Protokolle: Ebenen (ERROR/WARN/INFO/DEBUG), Korrelation 'trace _ id', Abschalten sensibler Daten.
Метрики: `requests_total`, `errors_total{status}`, `retry_count`, `latency_ms`, `throttled_total`.
Traces: OpenTelemetry hooks (span pro API-Aufruf, Attribute endpoint, status, retry).
Debug-Modus: Umgebungsvariable' GH _ SDK _ DEBUG = 1'- druckt HTTP-Header (ohne Geheimnisse) und Zeiten.
12) Dokumentation und Beispiele
Quickstart 5 Minuten: auth, erste Anfrage, Pagination, Verarbeitung 429.
Kochbuch: Webhooks (Signaturprüfung), idempotente Schrift, Replays.
API-Referenz: autogen von OpenAPI/Protobuf, aber mit „manuellen“ Beispielen.
Snippets: fertige Code-Stücke für gängige Aufgaben (Python/TS/Java/Go/.NET).
13) Erzeugung vs manuelle Codierung
Kombinierter Ansatz: codegen (Modelle/Kunden) + manuelle „Stifte“ für Ergonomie/Idempotenz/Paginatoren.
Die Schablonen: die einheitlichen Namen der Methoden (' create/get/list/update/delete '), stab. Signaturen.
Prüfung der „diff-Kompatibilität“ nach Regen (CI-Gate).
14) Versionierung, Kompatibilität und Deprecationen
SemVer: X.Y.Z. Das Brechen ist nur das Große.
Stabilitätspolitik: Nebenveröffentlichungen - Felder/Methoden hinzufügen, Verträge nicht ändern.
Deprecation: Anmerkungen/Attribute @ Deprecated/Obsolete, Warnungen in Rantayme einmal pro Prozess, Fenster ≥ 90 Tage.
LTS-Zweige: Backport von Critfixes (keine neuen Fich).
15) Freigaben und Lieferkette
CI/CD: Linter/Formatierer, Unit + Integration, Vertragstests, e2e vs. Sandbox.
Signatur der Artefakte: Sigstore/GPG, checksums auf den Releases.
Veröffentlichung: npm/PyPI/Maven/NuGet/Go/Composer/RubyGems mit Changelog und Release Notes.
SemVer gate: Auto-Check der Kompatibilität der öffentlichen API (z.B. 'apiregistry diff').
16) Prüfung (Qualitätsmatrix)
Einheit: Modelle, Serialisierung, Validierung, Retrays/Timeouts.
Vertrag: gegen OpenAPI/Protobuf-Schemata (negative/Randfälle).
Integration: gegen die Sandbox (Idempotenz, 429/5xx, Webhooks).
Laden/Soak: Pagination/Stream, Backpressure.
Fuzz: Felder/Titel/Zeitgrenzen.
Compat: Alte SDKs ↔ neue APIs und umgekehrt.
Smoke-Pack: 5 Minuten, um die Regression in CI zu fangen.
17) Telemetrie- und Datenschutzrichtlinien
Optional-opt-in: Sammlung aggregierter SDK-Metriken (Version, Sprache, Status) ohne PII.
Config: 'telemetry: off' anonymized 'full' (default off/anonymized).
Transparenz: Dokumentieren Sie, was und warum gesammelt wird; Deaktivieren Sie das Kontrollkästchen.
18) Leistung und FinOps
Batching: Kombinieren Sie kleine Anfragen; RPS begrenzen; gzip/br.
ETag/If-None-Match-Cache, bedingte GETs.
Sparsame Modelle: Faule Iteratoren, anstatt alles in den Speicher zu laden.
Parallelität zum Limit: 'max _ concurrency', also keine' DDOSit 'API.
19) Typische SDK-Komponenten (Skelette)
Error (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) Unterstützung, SLA und Gemeinschaft
SLA nach SDK: kritische Bugs - fix ETA, Kommunikationskanäle, Kompatibilitätsmatrix (SDK↔API).
Issue templates: bug/feature/question, auto-triage nach Sprache/Version.
Roadmap/labels: «good first issue», «help wanted».
Security policy: `SECURITY. md', Kanal für Schwachstellenberichte, CVE bei Bedarf.
21) SDK-Qualitätscheckliste
- Ein einzelner Modellfehler ('status', 'error _ code', 'trace _ id', 'retriable').
- Timeouts/Retrays/Jitter, Respekt vor 'Retry-After'.
- Schreibidempotenz, automatisch 'Idempotency-Key'.
- Cursor-Paginierung, faule Iteratoren/Streams.
- WebhookVerifier mit HMAC/mTLS und Deduplizierung.
- Konfiguration über ENV/Konstruktor/Parameter.
- Logging/Metriken/OTel-Hooks, Debug-Modus ohne Geheimnisse.
- SemVer, Deprections ≥90 Tage, LTS-Zweige.
- Vollständige Beispiele und Cookbook zu beliebten Aufgaben.
- Die Matrix der Parität zwischen den Sprachen in CI.
22) Implementierungsplan (3 Iterationen)
1. MVP (2-3 Wochen): Basic Client, auth, 3-5 Key Endpoints, Paginierung, Single Error Model, Retrays/Timeouts; TS+Python.
2. Scale (3-5 Wochen): Java/Go/.NET, WebhookVerifier, Schreibidempotenz, Hooks Telemetrie, Modellgenerierung aus OpenAPI.
3. Pro (kontinuierlich): Streaming/SSE/gRPC, perf-Optimierungen, LTS-Zweige, erweitertes Cookbook, Migrations-/Deprection-Tools.
23) Mini-FAQ
Alles generieren oder mit den Händen schreiben?
Generieren Sie Modelle/Kunden und Ergonomics (Paginatoren, Retrays, Idempotenz, handliche Signaturen) manuell.
Benötige ich ein separates async-SDK?
В Python — да (`AsyncClient`); in JS - Standard; v.NET/Java - asynchrone Aufrufe nach Möglichkeit.
Wie hält man die Parität der Sprachen?
Matrix-Fich in CI, Releases „in Bändern“ (TS→Py→Java→Go→.NET) mit Auto-Report „was hinkt“.
Summe
Ein starkes SDK ist eine einzige Oberfläche, zuverlässige Ausfälle und vorhersehbare Verträge, die in allen Sprachen gleich sind. Geben Sie Entwicklern sichere Out-of-the-Box-Einstellungen, ein verständliches Fehlermodell, eine bequeme Paginierung und Verifizierung von Webhooks, vervollständigen Sie dies mit hochwertiger Dokumentation und strengem Semver. Dann werden die Integrationen schnell, der Support günstig und das Ökosystem nachhaltig und skalierbar sein.