ApsaraMQ for RocketMQ oferece suporte a mensagens transacionais distribuídas. Esse tipo de mensagem é ideal para cenários que exigem consistência eventual. Este tópico descreve os conceitos, benefícios, cenários, processo de interação, observações de uso e exemplos de código das mensagens transacionais do ApsaraMQ for RocketMQ.
Termos
Mensagem transacional: o ApsaraMQ for RocketMQ fornece um recurso de processamento de transações distribuídas semelhante ao X/Open XA para garantir a consistência das transações no ApsaraMQ for RocketMQ.
Half message: é uma mensagem temporariamente não entregável. Quando o producer envia uma mensagem ao broker do ApsaraMQ for RocketMQ, mas o broker não recebe o segundo reconhecimento (ACK) do producer, a mensagem é marcada como "temporariamente não entregável". Uma mensagem nesse estado é chamada de half message.ApsaraMQ for RocketMQ
Verificação de status da mensagem: o segundo ACK de uma mensagem transacional pode ser perdido se ocorrer uma falha transitória na rede ou se a aplicação do producer for reiniciada. Ao detectar que uma mensagem permanece como half message por um período prolongado, o broker do ApsaraMQ for RocketMQ envia uma solicitação ao producer para verificar se o status final da mensagem é Commit ou Rollback.
Benefícios
O ApsaraMQ for RocketMQ utiliza mensagens transacionais distribuídas para desacoplar aplicações e assegurar a consistência final dos dados. Transações grandes e tradicionais podem ser divididas em transações menores, o que aumenta a eficiência. Essa abordagem também garante a disponibilidade do sistema principal caso ocorra uma exceção em uma aplicação. Se uma aplicação continuar sem conseguir receber mensagens, basta complementar ou corrigir os dados apenas nessa aplicação, sem necessidade de reverter todas as mensagens.
Cenários
Ao adicionar itens ao carrinho de compras em aplicações de e-commerce, os sistemas de carrinho e de transações comerciais são acionados. O processamento assíncrono de mensagens transacionais distribuídas garante a consistência eventual entre esses dois sistemas. Nesse cenário, o sistema de transações é crítico, e o recurso de processamento de transações distribuídas deve assegurar que os pedidos sejam realizados com sucesso. O sistema de carrinho pode assinar apenas os tópicos relacionados a pedidos do ApsaraMQ for RocketMQ e executar as transações correspondentes. Dessa forma, o recurso de processamento de transações distribuídas assegura a consistência eventual entre os dois sistemas.
Processo de interação
A figura a seguir ilustra o processo de interação das mensagens transacionais. 
O procedimento para enviar uma mensagem transacional inclui as seguintes etapas:
Envie uma half message ao broker do ApsaraMQ for RocketMQ por meio do producer.
O broker do ApsaraMQ for RocketMQ converte a mensagem em uma mensagem persistente e envia um ACK ao producer para confirmar o recebimento. Neste momento, a mensagem é classificada como half message.
Execute a transação local no producer.
-
Envie um segundo ACK ao broker para submeter o resultado da execução da transação local. O resultado pode ser Commit ou Rollback.
Caso o broker receba o status Commit, ele marca a half message como entregável e a encaminha ao consumer.
Se o broker receber o status Rollback, a transação é revertida e a half message não é entregue ao consumer.
Em caso de desconexão de rede ou reinicialização da aplicação do producer, se o broker não receber o segundo ACK ou se o status da half message for Unknown, ele aguarda um período e envia uma solicitação a um producer no cluster para consultar o status da half message.
As etapas a seguir detalham a verificação de status de uma mensagem transacional:
Após receber a solicitação, verifique o resultado da execução da transação local correspondente à half message no producer.
Envie outro ACK ao broker do ApsaraMQ for RocketMQ com base no resultado da transação local. Em seguida, o broker processa a half message seguindo a Etapa 4.
Observações de uso
Regras para envio de mensagens
-
Ao enviar uma mensagem ao broker e executar a transação local, o método
executeretorna um dos seguintes estados:TransactionStatus.CommitTransaction: confirma a transação. O consumer pode consumir a mensagem.TransactionStatus.RollbackTransaction: reverte a transação. A mensagem é descartada e não pode ser consumida.TransactionStatus.Unknow: indica que a transação está em estado desconhecido. Após um período, o broker do ApsaraMQ for RocketMQ envia uma solicitação para verificar o status da mensagem.
Especifique a classe de implementação do método
LocalTransactionCheckerao criar um producer de mensagens transacionais chamandoONSFactory.createTransactionProducer. Isso permite que o broker verifique o status das mensagens transacionais caso ocorram exceções.-
Regras para verificação de status da mensagem: após a execução da transação local, o broker do ApsaraMQ for RocketMQ recebe um ACK indicando que o resultado é
TransactionStatus.Unknow, ou o producer encerra inesperadamente sem submeter o resultado da transação local. Nessas situações, o broker do ApsaraMQ for RocketMQ envia uma solicitação ao producer para verificar o resultado da transação local. Se não obtiver o resultado, o broker reenvia a solicitação em intervalos definidos.Intervalo de verificação: por padrão, o broker envia uma solicitação a cada 30 segundos durante 12 horas para verificar o status de uma half message.
-
Tempo de espera antes de verificar o status de uma nova half message: este parâmetro é definido pelo usuário. Caso o broker precise iniciar a verificação periódica de status, mas o tempo de espera para verificar uma nova half message ainda não tenha expirado, a verificação não ocorre.
O exemplo abaixo utiliza Java. A configuração define o tempo de espera de 60 segundos antes de verificar o status de uma nova half message.
Message message = new Message(); message.putUserProperties(PropertyKeyConst.CheckImmunityTimeInSeconds,"60");NotaNo entanto, o tempo real para verificar o status da nova mensagem pode variar de 0 a 30 segundos além do esperado, pois o broker verifica o status em intervalos predefinidos.
Por exemplo, se você definir o tempo de espera como 60 segundos, mas o broker iniciar a verificação periódica no 58º segundo após o recebimento da nova half message, a verificação não será realizada. Após 30 segundos, o broker inicia outra verificação periódica no 88º segundo. Nesse caso, a mensagem é verificada, resultando em um atraso de 28 segundos em relação ao tempo esperado.
Regras para consumo de mensagens
Mensagens transacionais não podem compartilhar group IDs com mensagens de outros tipos. A diferença é que as mensagens transacionais fornecem o mecanismo de verificação de status. O broker do ApsaraMQ for RocketMQ consulta os producers de mensagens por group ID.
Exemplos de código
Os tópicos a seguir fornecem exemplos de código em diferentes linguagens de programação para enviar e assinar mensagens transacionais:
-
TCP
C/C++ SDK Enviar e receber mensagens transacionais
-
HTTP
Python SDK Enviar e receber mensagens transacionais
Node.js SDK Enviar e receber mensagens transacionais