Design SDK e suporte linguístico
1) Metas SDK e critérios de sucesso
Developer Experience (DX): API intuitiva, semântica unificada entre os idiomas.
Confiabilidade: timeouts/retrai/idempotidade «da caixa».
Segurança: segredos, assinaturas, TLS, compatibilidade com ambientes proksi/企业.
Observabilidade: logs, métricas, pistas em ferramentas padrão de linguagem.
Economia: mínimo egress/CPU, paginação eficiente, batch.
Estabilidade: semver rigoroso, compatibilidade inversa, ramos LTS.
2) Princípios arquitetônicos
1. Thin cliente, strong contracts: um embrulho SDK acima do protocolo (REST/gRPC), sem lógica de negócio oculta.
2. Superfície Unificed: Conceitos idênticos (Cliente, Request, Response, Erro, Paginator, WebhookVerifier).
3. Safe by default: timeouts razoável, backoff exponencial + jitter, proteção contra repetições.
4. Config layering: END → arquivo config → o construtor → os parâmetros do método.
5. Transporte Pluggable: HTTP/gRPC trocáveis, compatíveis com o proksi/池 de conexões.
6. Testability: interfaces/feições, dependency inhation, record-replay.
7. I18n erros: o 'erro _ código' da máquina está estável; as mensagens são localizáveis.
8. Acessibility: Opções asincrônicas (normalmente 'AsyncClient') onde for apropriado.
9. Segurança-first: segredos não entram em logs, edição PII, criptobiotecas compatíveis FIPS, se necessário.
3) Tabela de suporte e paridade de recursos
4) Superfície base API (modelo canônico)
Entidades gerais
Cliente: configuração de transporte, chaves, retrações, telemetry hooks.
Request/Response: modelos de segurança/DTO, paginação/cursores.
Errador: classe única com 'status', 'erro _ código', 'trace _ id', 'retriable'.
Paginator/Iterator: excesso preguiçoso de páginas/cursores.
WebhookVerifier: verificação de HMAC/mTLS, dedução por 'event _ id'.
Mini-exemplo (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-exemplo (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) Configuração e ambiente de execução
ENV: `GH_API_KEY`, `GH_ENDPOINT`, `GH_TIMEOUT_MS`, `HTTP_PROXY/HTTPS_PROXY`, `GH_REGION`.
Construtor: substitui-o por ENV.
Per-call overrides: timeout/retrai ao nível do método.
TLS/mTLS: caminho para o certificado/chave, pinning CA, se necessário.
Poulas de conexões: keep-alive, HTTP/2, limitação de paralelismo.
6) Segurança da caixa
Segredos: Não logar, esconder em stack traces; redaction ``.
Assinaturas: HMAC para webhooks, 'X-Key-Id '/rotação de chaves, suporte a «duas chaves» ativo/next.
Idempotidade: Instalação transparente de 'Idempotency-Key' para operações write (reiniciamento seguro).
RBAC/Scopes: Listrações/constantes fáceis para escopos.
Política PII: interfaces de edição padrão para logar.
7) Confiabilidade: timeouts, retrações, back-off
Tempo padrão: 10-15s; connect 3-5s.
Retrai: para 5xx/408/429 (respeitar 'Retry-After'), backoff exponencial + jitter, limite de tentativas/tempo.
Circuito-breaker: opcional em SDK (ou recomendação para libs de terceiros).
Write Idumpotentes: repetição automática da chave; os conflitos → levantar '409 IDEMP _ REPLAY'.
8) Paginação, cursores e streaming
Cursor/iterador: excesso preguiçoso, repetições automáticas em erros transitivos.
Paginação Keyset: organização estável '(updated _ at, id)'.
Backpressure: limite de consultas simultâneas; в async-SDK — `async for`/`channels`.
Streaming (onde disponível): SSE/WebSocket/gRPC-stream com auto-recordect e dedução por 'sequence'.
9) Erros e contrato
Hierarquia unificada:- `ApiError` (базовый) → подтипы: `AuthError(401)`, `PermissionError(403)`, `NotFound(404)`, `Conflict(409)`, `RateLimit(429)`, `ValidationError(422)`, `ServerError(5xx)`.
- Свойства: `status`, `error_code`, `message`, `trace_id`, `retriable`, `details`.
- Best pratice: mensagens são humanas, 'erro _ código' é estável.
10) Idiomas da língua
TypeScript/JS
Promise-based + geradores de paginação; Pacotes ESM + CJS.
Tree-shaking, polifilos mínimos, sinais abort ('AbortController').
Python
Sync + Async (aiohttp/httpx), gerentes de contexto, 'pydantic' modelos (ou dataclasses).
Wheels для linux/macos/windows; suporte a proxies/NO _ PROXY.
Java
«CompletableFuture» (por necessidade), «AutoCloseable», «Duration», «Executor».
HTTP client: `java. net. http 'ou OkHttp; SLF4J para logs.
Go
Contextos 'context. Context`, `http. Cliente's tuned Transporte, interfaces para testes.
Error wrapping (`fmt. Errorf («% w», pr) '), semântica de erro sentinel.
.NET
`HttpClientFactory`, `CancellationToken`, `IAsyncEnumerable<T>`.
Políticas Polly (retry/circuito-breaker).
... etc para PHP/Ruby (PSR-18, Faraday/Net:: HTTP).
11) Logação, métricas, traçado
Níveis: (ERRO/WARN/INFO/DEBUG), corelação 'trace _ id', desativação de dados sensíveis.
Метрики: `requests_total`, `errors_total{status}`, `retry_count`, `latency_ms`, `throttled_total`.
Pistas: OpenTelemetry hooks (span para API, atributos de endpoint, status, retry).
Modo debug: variável de ambiente 'GH _ SDK _ DEBUG = 1' - impressão HTTP de títulos (sem segredos) e tempos.
12) Documentação e exemplos
Quickstart 5 minutos: auth, primeira consulta, paginação, processamento 429.
Cookbook: webhooks (verificação de assinatura), idumpotentes write, réplicas.
Guia API: Um gene automático de OpenAPI/Protobuf, mas com exemplos «manuais».
Snippets: pedaços de código prontos para tarefas populares (Python/TS/Java/Go/.NET).
13) Geração vs codificação manual
Abordagem combinada codegen (modelos/clientes) + «canetas» manuais para ergonomics/idempotadores/paginadores.
Modelos: um único nome de métodos ('create/get/list/update/delete'). assinaturas.
Verificação de compatibilidade de desenho após regen (CI-gate).
14) Versionização, compatibilidade e depredação
SemVer: X.Y.Z. O quebrador é apenas o maior.
Política de estabilidade: lançamentos menores - adicionando campos/métodos, não alterando contratos.
Deprecation: Anotações/atributos @ Deprecated/Obsolete, avisos no RAND uma vez por processo, janela ≥ 90 dias.
Ramos LTS: backport de critics (sem novas fichas).
15) Lançamentos e cadeia de entregas
CI/CD: Linters/formatores, unit + integração, teste de contrato, e2e vs. banco de areia.
A assinatura dos artefatos é Sigstore/GPG, checksuns nos lançamentos.
Publicação: npm/PyPI/Maven/NuGet/Go/Composer/RubyGems com changelog e notas release.
gate: verificação automática da compatibilidade da API pública (por exemplo, 'apiregistry diff').
16) Testes (matriz de qualidade)
Unit: modelos, serialização, validação, retais/temporizações.
Contract: contra esquemas OpenAPI/Protobuf (negative/edge cases).
Integration: contra sandbox (Idumpotência, 429/5xx, webhooks).
Load/soak: paginação/estirpe, backpressure.
Fuzz: campos/cabeçalhos/limite de tempo.
Compat: SDK antigo ↔ novas APIs e vice-versa.
Smoke-pack: 5 minutos para capturar regresso em CI.
17) Políticas de telemetria e privacidade
Opcional-opt-in: coleta de métricas SDK agregadas (versão, língua, estatais) sem PII.
Config: 'telemetry: off' anonymized 'full' (padrão off/anonymized).
Transparência: Documente o que vai e porquê; Deixe a caixa desligada.
18) Desempenho e FinOps
Batching: combinar pequenos pedidos; limitar o RPS; gzip/br.
Armazenamento em dinheiro ETag/If-None-Match, GET condicional.
Modelos econômicos: iteradores preguiçosos em vez de carregar tudo na memória.
Paralelismo com o limite «max _ concurrency» para não ser «DDOSIT» API.
19) Componentes típicos SDK (esqueletos)
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}`); }
}
Paginador (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) Apoio, SLA e comunidade
SLA SDK: bags críticos - fix ETA, canais de comunicação, matriz de compatibilidade (SDK↔API).
Issue templates: bug/função/pergunta, auto-triagem de linguagem/versão.
Roadmap/labels: «good first issue», «help wanted».
Security policy: `SECURITY. md ', canal de relatórios de vulnerabilidade, CVE, se necessário.
21) Folha de cheque de qualidade SDK
- Um único erro-modelo ('status', 'erro _ código', 'trace _ id', 'retriable').
- Timeouts/retrai/jitter, respeito 'Retry-After'.
- Idempotidade write, automático 'Idempotency-Key'.
- Paginação com cursor, iteradores/striptease preguiçosos.
- WebhookVerifier com HMAC/mTLS e dedução.
- Configuração por ENV/projeto/configuração.
- Logar/métricas/OTel-ganchos, modo debug sem segredos.
- SemVer, depressões de ≥90 dias, ramos LTS.
- Exemplos completos e cookbook para tarefas populares.
- Matriz de paridade de fic entre línguas CI.
22) Plano de implementação (3 iterações)
1. MVP (2-3 semanas): Cliente básico, auth, 3-5 endpoint chave, paginação, um único erro-modelo, retrações/temporizações; TS+Python.
2. Scale (3-5 semanas): Java/Go/.NET, WebhookVerifier, idempotidade write, telemetria hooks, geração de modelos a partir de OpenAPI.
3. Pro (contínuo): streaming/SSE/gRPC, otimização perf, ramos LTS, Cookbook avançado, ferramentas de migração/depredação.
23) Mini-FAQ
Gerar tudo ou escrever com as mãos?
Gere modelos/clientes e ergonomics (paginadores, retais, idempotação, assinaturas confortáveis) manualmente.
Será necessário um async-SDK separado?
В Python — да (`AsyncClient`); JS - padrão; NET/Java - chamadas asincrônicas sempre que possível.
Como manter a paridade de línguas?
Matriz de Fic em CI, lançamentos «por raio» (TS→Py→Java→Go→.NET) com «o que está atrasado».
Resultado
O SDK forte é uma superfície única, default confiável e contratos previsíveis iguais em todas as línguas. Dê aos desenvolvedores configurações seguras de caixa, um modelo de erro compreensível, paginação fácil e verificação de webhooks, conclua com documentação de qualidade e semver rigoroso. A integração será rápida, o apoio será barato e o ecossistema sustentável e escalável.