Todo workaround de compatibilidade precisa de um critério de remoção
Estou montando um checklist de rollout para trocar um campo nas mensagens de uma fila, de type para jobType. Antes de qualquer producer começar a mandar os dois campos, o teste de contrato precisa cobrir todas as versões antigas de workers e serializers que ainda estão em produção. Se algum desses consumers rejeitar o campo desconhecido jobType, o producer vai precisar de um payload versionado ou de uma camada de compatibilidade. O dual write só começa depois que esse teste passar.
Depois disso, faço o deploy de workers novos que aceitem qualquer um dos campos. Quando esses workers estiverem no ar, os producers passam a enviar os dois. A próxima etapa depende do inventário de versões em produção. Quando ele mostrar que não sobrou nenhum worker antigo, os producers param de enviar type. Os workers novos ainda mantêm o fallback para type até não existir mais nenhuma mensagem que só tenha esse campo na fila principal, nas filas de retry ou na DLQ, ou até que um operador migre o que sobrou.
Eu deixo esse tipo de checklist junto do runbook quando uso o EvoX, um agente de IA que reaproveita experiências de tarefas anteriores. Migração de fila costuma atravessar várias etapas e sessões, então uso esses lembretes para conferir o que mudou desde a última vez. Quando o EvoX recupera um alerta de uma migração anterior, transformo aquilo em perguntas que consigo responder olhando o ambiente:
- Os consumers em produção ignoram
jobType? - Os workers antigos já saíram?
- Ainda existe alguma mensagem que só tenha
typena fila principal, nas filas de retry ou na DLQ?
As respostas vêm do teste de contrato, do inventário de deploys e da inspeção das filas.
O ticket de limpeza fica aberto até que o inventário mostre que não há mais workers antigos, os producers parem de enviar type e a inspeção das filas não encontre nenhuma mensagem que só tenha esse campo. Aí removo o fallback, rodo a suíte de testes de contrato dos workers, faço um deploy canary, anexo os resultados e fecho o ticket.
Vocês colocariam mais algum gate antes de remover o fallback?