v0.4.0
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 |
3. Outros
UnhandledTopicPolicyemLambdaBrokereKafkaBroker: tópico Kafka sem handler continua sendo ignorado por padrão (agora comtracing::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 embatchItemFailuresem vez de ack silencioso.EventRouter+RetryPolicy::Exponential: backoff comsaturating_mule expoente limitado — sem panic por overflow deDuration.tracingdeixa de ser dependência opcional deserverust-events.
Métricas
hello-world stripped: 3.549.224 → 3.550.744 bytes (+0,04%). Invariante de <10 MB preservada.
CHANGELOG completo: CHANGELOG.md