Integração e API

Paginação por Cursor

Quando listas mudam enquanto são percorridas, a paginação por cursor reduz saltos e duplicações comuns ao esquema `offset/limit`. O servidor devolve um token opaco, como `next_cursor`, que o cliente reutiliza. Stripe usa `starting_after`; Azure emprega continuation tokens em serviços como Cosmos DB e Tables. O desenho precisa de ordenação estável e retenção do cursor. A limitação é que não permite saltar diretamente para a página 50 nem inferir total com facilidade.


🔀 Tipos de Comunicação
NEXT_CURSOR
Cursor opaco retornado no corpo
A resposta contém `items` e `next_cursor`. O cliente não interpreta o token; envia exatamente no próximo pedido. O servidor pode codificar chave de ordenação, ID, partição, filtro e assinatura. Base64 não é segurança; tokens com dados sensíveis precisam de proteção ou referência server-side. O cursor deve estar ligado aos parâmetros da consulta para impedir uso com filtro diferente. Se a primeira chamada usa `room=sala&sort=created_at`, a continuação precisa preservar. Alterar o filtro deve iniciar nova paginação. O contrato define `null` quando termina. Uma página vazia pode ainda ter continuação em sistemas particionados, portanto o cliente deve seguir o token até ausência, não parar apenas por zero itens.
KEYSET
Keyset pagination por chave ordenada
O cursor pode representar a última chave vista. A consulta usa `WHERE (created_at,id) > (?,?) ORDER BY created_at,id LIMIT 100`. O ID desempata timestamps iguais. Esse método evita que inserções anteriores desloquem offsets. É eficiente com índice adequado. A ordenação precisa ser total e imutável durante a leitura. Se o campo muda, itens podem aparecer novamente ou sumir. Para telemetria, `(timestamp,event_id)` funciona. Para dispositivos ordenados por nome editável, é menos estável. O banco precisa de índice composto. O cursor não deve expor SQL diretamente. A API pode assinar o token. O uso reverso exige cursor e operador correspondentes.
TOKEN
Continuation token controlado pelo serviço
Serviços distribuídos devolvem token que contém progresso entre partições. Azure Table Storage retorna cabeçalhos de continuação com próxima partição e row key; Cosmos DB usa `x-ms-continuation`. O token pode mudar de formato e deve ser tratado como opaco. O SDK normalmente gerencia. O servidor pode expirar tokens após mudanças, upgrades ou retenção. O cliente precisa salvar junto com consulta, versão e timestamp. Uma integração que persiste o token por meses sem política pode falhar. Quando recebe `InvalidContinuationToken`, deve reiniciar ou ressincronizar conforme o contrato, evitando duplicar efeitos. Para leitura, deduplicação por ID ajuda.
EVENT CURSOR
Cursor para feeds e eventos
Em feeds de eventos, o cursor representa sequência ou offset. O cliente lê 500 eventos, grava o cursor depois de processar e continua. Isso aproxima consumo de log. A confirmação local precisa ser atômica com o efeito quando possível. Se grava o cursor antes, pode perder; depois, pode repetir. Processamento idempotente resolve repetição. O servidor precisa definir retenção. Se o cursor é mais antigo que 7 dias e o log retém 7 dias, responde `410 Gone` ou código próprio e exige snapshot. Em automação, uma sincronização robusta combina snapshot atual e eventos a partir de uma posição consistente.
✅ Vantagens Arquiteturais
Mantém melhor consistência em listas que recebem inserções
Com offset, o cliente lê itens 1–100. Um novo item entra no início. A próxima consulta `offset=100` pode repetir o item que deslocou. Se um item é removido, pode saltar. Com cursor baseado na última chave, a continuação começa após ela. Isso reduz anomalias. Não garante snapshot completo. Itens que mudam de ordenação podem mover. Para snapshot forte, usa-se transação, timestamp de corte ou versão. O cursor pode incluir `as_of`. O critério é requisito de consistência. Um dashboard tolera; exportação financeira pode exigir. A API precisa documentar.
Escala melhor em bancos com grandes offsets
`OFFSET 1000000 LIMIT 100` pode exigir percorrer e descartar muitas linhas. Keyset usa índice para buscar após a chave, com custo mais estável. A diferença cresce em milhões de registros. Em banco distribuído, continuation token evita recalcular. O ganho depende do índice e do filtro. Uma consulta sem índice continua cara. O cursor também pode carregar estado interno, reduzindo planejamento. O servidor precisa limitar `page_size`, como 100 ou 1000. Páginas grandes consomem memória e aumentam tempo. O tamanho ideal depende do payload e da rede.
Evita expor estrutura interna como número de página
O token opaco permite mudar particionamento e algoritmo sem alterar o cliente, desde que tokens em uso permaneçam válidos pelo período prometido. O cliente só sabe “próximo”. Isso reduz acoplamento. A desvantagem é pior experiência para interfaces que querem página 1, 2, 3 e total. Para scroll infinito e sincronização, cursor é natural. Para relatório paginado com acesso aleatório, offset pode ser mais simples. A API pode oferecer ambos, mas aumenta teste. O critério de escolha precisa considerar UX e escala, não moda.
Combina bem com limites e retomada de sincronização
Um integrador pode persistir cursor e continuar após reinício. Para 1 milhão de eventos, processa em páginas de 500. Se falha na página 120, retoma. O cursor precisa ser salvo somente após concluir. Se a API permite cursor durável. Caso contrário, use checkpoint por chave própria. A retomada reduz tempo e carga. Dados mutáveis precisam de estratégia para updates e deletes; uma lista paginada não substitui CDC. Para sincronização incremental, cursor deve apontar a changelog. O sistema precisa distinguir paginação de snapshot e feed de mudanças.
Permite tokens assinados com contexto de consulta
O servidor pode serializar `{last_id,sort,filter,exp}` e assinar com HMAC. O cliente não consegue alterar sem invalidar. Isso evita que um cursor seja usado para ampliar filtro ou acessar tenant. A autorização ainda precisa ser reavaliada em cada chamada. O token não substitui autenticação. Se contém dados, criptografia pode ser necessária. Tamanho precisa caber em URL ou cabeçalho. Tokens longos podem exceder limites de proxy. Armazenar estado server-side produz token curto, mas exige cache compartilhado. A escolha é trade-off.