Skip to content

v0.4.0

Choose a tag to compare

@JaimeJunr JaimeJunr released this 14 Sep 00:17
· 25 commits to main since this release
9867c1f

Release com uma quebra de API e duas mudanças de comportamento em runtime que não quebram a compilação. Se você roda serverust em produção com SQS, leia o item 2 antes de subir.

1. Quebra de API — serverust-telemetry

IdempotencyStore::try_acquire passa a devolver um token de aquisição, e release/complete passam a exigi-lo (fencing). Sem isso, um worker cujo TTL expirou podia apagar ou completar o lock de outro worker.

Afeta quem implementa o trait IdempotencyStore ou faz match em AcquireOutcome diretamente.
Não afeta quem só monta o IdempotencyLayer com InMemoryIdempotencyStore / DynamoDbIdempotencyStore.

// antes
AcquireOutcome::Acquired => { store.complete(&key, now, ttl).await?; }

// depois
AcquireOutcome::Acquired(token) => { store.complete(&key, &token, now, ttl).await?; }

Implementando o trait: release/complete devem ser no-op de sucesso quando o token não bate com o do registro corrente. No DynamoDB isso é uma condition_expression com estado e token — sem migração de schema, o atributo token passa a ser gravado nos registros novos.

2. Mudanças de comportamento (nada a alterar no código)

Cenário 0.3.x 0.4.0
Handler falha com IdempotencyLayer ativo Lock InProgress ficava até o TTL (24h por padrão); redeliveries do SQS não reexecutavam o handler e a mensagem ia para a DLQ sem nunca ser processada Lock é liberado; a próxima redelivery reexecuta o handler
EventRouter::with_dlq, publish na DLQ bem-sucedido Retornava Err; a Lambda não removia a mensagem — loop de redelivery com escrita duplicada na DLQ Retorna Ok(()); a mensagem original recebe ack

⚠️ O efeito prático do primeiro é mais reprocessamento de mensagens que antes ficavam presas. Se o seu handler dependia do lock como única garantia de idempotência, confira isso antes de subir.

3. Outros

  • UnhandledTopicPolicy em LambdaBroker e KafkaBroker: tópico Kafka sem handler continua sendo ignorado por padrão (agora com tracing::warn! em vez de silêncio). Para falhar, é opt-in: .with_unhandled_topic_policy(UnhandledTopicPolicy::Error).
  • SqsBroker::handle_sqs_event: mensagem sem handler para a fila do ARN entra em batchItemFailures em vez de ack silencioso.
  • EventRouter + RetryPolicy::Exponential: backoff com saturating_mul e expoente limitado — sem panic por overflow de Duration.
  • tracing deixa de ser dependência opcional de serverust-events.

Métricas

hello-world stripped: 3.549.224 → 3.550.744 bytes (+0,04%). Invariante de <10 MB preservada.

CHANGELOG completo: CHANGELOG.md