SDK дизайн і підтримка мов
1) Цілі SDK і критерії успіху
Developer Experience (DX): інтуїтивні API, єдина семантика між мовами.
Надійність: таймаути/ретраї/ідемпотентність «з коробки».
Безпека: секрети, підписи, TLS, сумісність з proksi/企业 середовищами.
Спостережуваність: логи, метрики, траси в стандартних для мови інструментах.
Економіка: мінімум egress/CPU, ефективна пагінація, батчі.
Стабільність: строгий semver, зворотна сумісність, LTS-гілки.
2) Архітектурні принципи
1. Thin client, strong contracts: SDK обгортка над протоколом (REST/gRPC), без прихованої бізнес-логіки.
2. Unified surface: однакові поняття (Client, Request, Response, Error, Paginator, WebhookVerifier).
3. Safe by default: розумні таймаути, експоненціальний backoff + jitter, захист від повторів.
4. Config layering: ENV → конфіг-файл → конструктор → параметри методу.
5. Pluggable transport: HTTP/gRPC змінюються, сумісні з proksi/池 з'єднань.
6. Testability: інтерфейси/фейки, dependency injection, record-replay.
7. I18n помилок: машинний'error _ code'стабільний; повідомлення локалізуються.
8. Accessibility: асинхронні варіанти (зазвичай «AsyncClient») там, де це доречно.
9. Security-first: секрети не потрапляють в логи, PII-редакція, FIPS-сумісні криптобібліотеки при необхідності.
3) Таблиця підтримки і паритет можливостей
4) Базова поверхня API (канонічна модель)
Загальні сутності
Client: налаштування транспорту, ключів, ретраїв, telemetry hooks.
Request/Response: типобезпечні моделі/DTO, пагінація/курсори.
Error: єдиний клас з'status','error _ code','trace _ id','retriable'.
Paginator/Iterator: ледачий перебір сторінок/курсорів.
WebhookVerifier: перевірка HMAC/mTLS, дедуп по'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`.
Конструктор: перевизначає ENV.
Per-call overrides: таймаут/ретраї на рівні методу.
TLS/mTLS: шлях до сертифіката/ключа, pinning CA при необхідності.
Пули з'єднань: keep-alive, HTTP/2, обмеження паралелізму.
6) Безпека з коробки
Секрети: не логувати, приховувати в stack traces; redaction ``.
Підписи: HMAC для вебхуків,'X-Key-Id '/ротація ключів, підтримка «двох ключів» active/next.
Ідемпотентність: прозора установка'Idempotency-Key'для write-операцій (перезапуск безпечний).
RBAC/Scopes: зручні перерахування/константи для скоупів.
PII-політика: стандартні інтерфейси редагування при логуванні.
7) Надійність: таймаути, ретраї, бек-офф
Типовий таймаут: 10-15с; коннект 3-5с.
Ретраї: для 5xx/408/429 (поважати'Retry-After'), експоненціальний backoff + jitter, межа спроб/часу.
Circuit-breaker: опціонально в SDK (або рекомендації по сторонніх лібах).
Ідемпотентні write: автоматичний повтор по ключу; колізії → підняти'409 IDEMP_REPLAY'.
8) Пагінація, курсори та стрімінг
Курсор/ітератор: ледачий перебір, авто-повтори при транзієнтних помилках.
Keyset-пагінація: стабільне впорядкування «(updated_at,id)».
Backpressure: ліміт одночасних запитів; в async-SDK — `async for`/`channels`.
Стрімінг (де доступно): SSE/WebSocket/gRPC-stream з авто-reconnect і дедупом по'sequence'.
9) Помилки і контракт
Єдина ієрархія:- '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: повідомлення - людиночитані,'error _ code'- стабільний.
10) Мовні ідіоми
TypeScript/JS
Promise-based + генератори для пагінації; ESM + CJS пакети.
Tree-shaking, мінімальні поліфіли, abort-сигнали ('AbortController').
Python
Sync + Async (aiohttp/httpx), контекст-менеджери,'pydantic'моделі (або dataclasses).
Wheels для linux/macos/windows; підтримка proxies/NO_PROXY.
Java
'CompletableFuture'( за потребою),'AutoCloseable','Duration','Executor'.
HTTP client: `java. net. http'або OkHttp; SLF4J для логів.
Go
Контексти'context. Context`, `http. Client'з tuned Transport, інтерфейси для тестів.
Error wrapping (`fmt. Errorf («% w», err)'), семантика sentinel помилок.
.NET
`HttpClientFactory`, `CancellationToken`, `IAsyncEnumerable<T>`.
Політики Polly (retry/circuit-breaker).
... тощо для 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 hooks (span на виклик API, атрибути endpoint, status, retry).
Debug-mode: змінне середовище'GH _ SDK _ DEBUG = 1'- друк HTTP заголовків (без секретів) і часів.
12) Документація та приклади
Quickstart 5 хвилин: auth, перший запит, пагінація, обробка 429.
Cookbook: вебхуки (перевірка підпису), ідемпотентний write, реплей.
Довідник API: автоген з OpenAPI/Protobuf, але з «ручними» прикладами.
Snippets: готові шматки коду для популярних завдань (Python/TS/Java/Go/.NET).
13) Генерація vs ручне кодування
Комбінований підхід: codegen (моделі/клієнти) + ручні «ручки» для ergonomics/ідемпотентності/пагінаторів.
Шаблони: єдині назви методів ('create/get/list/update/delete'), стаб. сигнатури.
Перевірка «diff-сумісності» після регену (CI-гейт).
14) Версіонування, сумісність і депрекації
SemVer: X.Y.Z. Ламаюче - тільки major.
Політика стабільності: мінорні релізи - додають поля/методи, не змінюють контракти.
Deprecation: анотації/атрибути @Deprecated/Obsolete, попередження в рантаймі один раз за процес, вікно ≥ 90 днів.
LTS-гілки: backport крітфіксів (без нових фіч).
15) Релізи та ланцюжок постачання
CI/CD: лінтери/форматери, unit + integration, контракт-тести, e2e проти пісочниці.
Підпис артефактів: Sigstore/GPG, checksums на релізах.
Публікація: npm/PyPI/Maven/NuGet/Go/Composer/RubyGems с changelog и release notes.
SemVer gate: авто-перевірка сумісності публічного API (наприклад,'apiregistry diff').
16) Тестування (матриця якості)
Unit: моделі, серіалізація, валідація, ретраї/таймаути.
Contract: проти OpenAPI/Protobuf схем (negative/edge cases).
Integration: проти sandbox (ідемпотентність, 429/5xx, webhooks).
Load/soak: пагінація/стрім, backpressure.
Fuzz: поля/заголовки/межі часу.
Compat: старі SDK ↔ нові API і навпаки.
Smoke-pack: 5 хвилин, щоб зловити регрес в CI.
17) Політики телеметрії та приватності
Опціонально-opt-in: збір агрегованих метрик SDK (версія, мова, статуси) без PII.
Конфіг: `telemetry: off'anonymized'full'( за замовчуванням off/anonymized).
Прозорість: документуйте, що і навіщо збирається; давайте прапорець відключення.
18) Продуктивність і ФінОпс
Batching: об'єднувати дрібні запити; лімітувати RPS; gzip/br.
Кешування ETag/If-None-Match, умовні GET.
Економічні моделі: ліниві ітератори замість завантаження всього в пам'ять.
Паралелізм з лімітом: 'max _ concurrency', щоб не «DDOSити» API.
19) Типові компоненти SDK (скелети)
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}`); }
}
Пагінатор (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 та спільнота
SLA по SDK: критичні баги - fix ETA, канали зв'язку, матриця сумісності (SDK↔API).
Issue templates: bug/feature/question, auto-triage за мовою/версією.
Roadmap/labels: «good first issue», «help wanted».
Security policy: `SECURITY. md', канал для звітів про вразливості, CVE при необхідності.
21) Чек-лист якості SDK
- Єдина помилка-модель ('status','error _ code','trace _ id','retriable').
- Таймаути/ретраї/jitter, повага'Retry-After'.
- Ідемпотентність write, автоматичний'Idempotency-Key'.
- Пагінація курсором, ліниві ітератори/стріми.
- WebhookVerifier з HMAC/mTLS і дедупом.
- Конфігурація через ENV/конструктор/параметри.
- Логування/метрики/OTel-хуки, debug-режим без секретів.
- SemVer, депрекації ≥90 днів, LTS-гілки.
- Повні приклади і Cookbook за популярними завданнями.
- Матриця паритету фіч між мовами в CI.
22) План впровадження (3 ітерації)
1. MVP (2-3 тижні): базовий Client, auth, 3-5 ключових ендпоінтів, пагінація, єдина помилка-модель, ретраї/таймаути; TS+Python.
2. Scale (3-5 тижнів): Java/Go/.NET, WebhookVerifier, ідемпотентність write, телеметрія hooks, генерація моделей з OpenAPI.
3. Pro (безперервно): стрімінг/SSE/gRPC, perf-оптимізації, LTS-гілки, розширений Cookbook, інструменти міграцій/депрекацій.
23) Міні-FAQ
Генерувати все або писати руками?
Генеруйте моделі/клієнтів, а ergonomics (пагінатори, ретраї, ідемпотентність, зручні сигнатури) - вручну.
Чи потрібен окремий async-SDK?
В Python — да (`AsyncClient`); у JS - за замовчуванням; в.NET/Java - асинхронні виклики по можливості.
Як тримати паритет мов?
Матриця фіч в CI, релізи «по поясках» (TS→Py→Java→Go→.NET) з авто-репортом «що відстає».
Підсумок
Сильний SDK - це єдина поверхня, надійні дефолти і передбачувані контракти, однакові у всіх мовах. Дайте розробникам безпечні налаштування «з коробки», зрозумілу помилку-модель, зручну пагінацію і верифікацію вебхуків, завершіть це якісною документацією і строгим semver. Тоді інтеграції будуть швидкими, підтримка - дешевою, а екосистема - стійкою і масштабованою.