As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Práticas recomendadas do Amazon MQ para ActiveMQ
Use esta seção como referência para localizar rapidamente as recomendações para maximizar a performance e minimizar os custos de taxa de transferência para trabalhar com agentes do ActiveMQ no Amazon MQ.
Nunca modifique ou exclua a interface de rede elástica do Amazon MQ
Quando você cria um agente Amazon MQ pela primeira vez, o Amazon MQ provisiona uma interface de rede elásticana Virtual Private Cloud VPC () em sua conta e, portanto, exige várias permissões. EC2 A interface de rede permite que seu cliente (produtor ou consumidor) se comunique com o agente do Amazon MQ. A interface de rede é considerada dentro do escopo do serviço do Amazon MQ, apesar de fazer parte da sua conta. VPC
Atenção
Você não deve modificar ou excluir essa interface de rede. Modificar ou excluir a interface de rede pode causar uma perda permanente da conexão entre você VPC e seu corretor.
Sempre usar pooling de conexão
Em um cenário com um único produtor e um único consumidor (como o Começando: Criando e conectando-se a um corretor ActiveMQ tutorial), você pode usar uma única ActiveMQConnectionFactory
// Create a connection factory.
final ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(wireLevelEndpoint);
// Pass the sign-in credentials.
connectionFactory.setUserName(activeMqUsername);
connectionFactory.setPassword(activeMqPassword);
// Establish a connection for the consumer.
final Connection consumerConnection = connectionFactory.createConnection();
consumerConnection.start();
No entanto, em cenários mais realistas com vários produtores e consumidores, pode ser dispendioso e ineficiente criar um grande número de conexões para vários produtores. Nesses cenários, você deve agrupar solicitações de vários produtores usando a classe PooledConnectionFactory
nota
Os consumidores de mensagens nunca devem usar a classe PooledConnectionFactory
.
// Create a connection factory.
final ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(wireLevelEndpoint);
// Pass the sign-in credentials.
connectionFactory.setUserName(activeMqUsername);
connectionFactory.setPassword(activeMqPassword);
// Create a pooled connection factory.
final PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory();
pooledConnectionFactory.setConnectionFactory(connectionFactory);
pooledConnectionFactory.setMaxConnections(10);
// Establish a connection for the producer.
final Connection producerConnection = pooledConnectionFactory.createConnection();
producerConnection.start();
Sempre usar o transporte de failover para conectar-se a vários endpoints de operador
Se você precisar que a aplicação se conecte a vários endpoints do agente — por exemplo, ao usar um modo de implantação ativo/em espera ou ao migrar de um agente de mensagens no local para o Amazon MQ — use o transporte de failover
failover:(ssl://b-1234a5b6-78cd-901e-2fgh-3i45j6k178l9-1.mq.us-east-2.amazonaws.com:61617,ssl://b-9876l5k4-32ji-109h-8gfe-7d65c4b132a1-2.mq.us-east-2.amazonaws.com:61617)?randomize=true
Evite usar seletores de mensagens
É possível usar JMSseletores
Em geral, evite permitir que os consumidores roteiem mensagens, pois, para um bom desacoplamento de consumidores e produtores, ambos devem ser temporários.
Preferir destinos virtuais a assinaturas duráveis
Uma assinatura durável
Se estiver usando o Amazon VPC Peering, evite clientes ao IPs alcance CIDR 10.0.0.0/16
Se você estiver configurando o Amazon VPC peering entre a infraestrutura local e seu agente Amazon MQ, você não deve configurar conexões de clientes dentro do alcance. IPs CIDR 10.0.0.0/16
Desativar o armazenamento e a expedição simultâneos para filas com consumidores lentos
Por padrão, o Amazon MQ é otimizado para filas com consumidores rápidos:
-
Os consumidores são considerados rápidos se conseguem acompanhar a taxa de mensagens geradas pelos produtores.
-
Os consumidores são considerados lentos se uma fila cria um acúmulo de mensagens não confirmadas, o que pode reduzir a taxa de transferência do produtor.
Para instruir o Amazon MQ para ser otimizado para filas com consumidores lentos, defina o atributo concurrentStoreAndDispatchQueues
como false
. Para obter uma configuração de exemplo, consulte concurrentStoreAndDispatchQueues.
Selecionar o tipo de instância de agente correto para obter a melhor taxa de transferência
A taxa de transferência de mensagens de um tipo de instância de agentedepende do caso de uso da aplicação e dos seguintes fatores:
-
Uso do ActiveMQ no modo persistente
-
Tamanho da mensagem
-
O número de produtores e consumidores
-
O número de destinos
Noções básicas sobre o relacionamento entre o tamanho, a latência e a taxa de transferência de mensagens
Dependendo do caso de uso, um tipo de instância de agente maior pode não necessariamente melhorar a taxa de transferência do sistema. Quando o ActiveMQ grava mensagens em um armazenamento durável, o tamanho de suas mensagens determina o fator limitante do sistema:
-
Se as mensagens forem menores que 100 KB, a latência do armazenamento persistente será o fator limitante.
-
Se as mensagens forem maiores que 100 KB, a taxa de transferência do armazenamento persistente será o fator limitante.
Ao usar o ActiveMQ no modo persistente, a gravação no armazenamento ocorrerá normalmente quando houver alguns consumidores ou quando os consumidores forem lentos. No modo não persistente, a gravação no armazenamento também ocorrerá com consumidores lentos se a memória do heap da instância de agente estiver cheia.
Para determinar o melhor tipo de instância de agente para a sua aplicação, recomendamos testar diferentes tipos de instância de operador. Para obter mais informações, consulte Broker instance types e também Medindo a taxa de transferência do Amazon MQ usando JMS
Casos de uso de tipos de instância de agente maiores
Há três casos de uso comuns quando tipos de instância de agente maiores melhoram a taxa de transferência:
-
Modo não persistente: quando sua aplicação é menos sensível à perda de mensagens durante o failover de instância de agente (por exemplo, ao transmitir placares de esportes), muitas vezes você pode usar o modo não persistente do ActiveMQ. Nesse modo, o ActiveMQ grava mensagens no armazenamento persistente somente se a memória do heap da instância de agente está cheia. Os sistemas que usam o modo não persistente podem se beneficiar da maior quantidade de memória e da rede cada CPU vez mais rápida disponível em tipos maiores de instâncias de broker.
-
Consumidores rápidos: quando os consumidores ativos estão disponíveis e o sinalizador concurrentStoreAndDispatchQueues está habilitado, o ActiveMQ permite o fluxo das mensagens diretamente do produtor para o consumidor sem enviar mensagens ao armazenamento (mesmo em modo persistente). Se a sua aplicação pode consumir mensagens rapidamente (ou se você pode projetar seus consumidores para fazer isso), a aplicação pode se beneficiar de um tipo de instância de agente maior. Para permitir que seu aplicativo consuma mensagens com mais rapidez, adicione threads de consumidor às instâncias do aplicativo ou expanda as instâncias do aplicativo verticalmente ou horizontalmente.
-
Transações em lote: quando você usa o modo persistente e envia várias mensagens por transação, você pode obter uma taxa de transferência de mensagens em geral mais alta usando tipos de instância de agente maiores. Para obter mais informações, consulte Devo usar transações?
na documentação do ActiveMQ.
Escolha o tipo de armazenamento de agente correto para obter a melhor taxa de transferência
Para aproveitar a alta durabilidade e a replicação em várias zonas de disponibilidade, use a AmazonEFS. Para aproveitar a baixa latência e a alta taxa de transferência, use a Amazon. EBS Para obter mais informações, consulte Storage.
Configurar sua rede de agentes corretamente
Quando você cria uma rede de agentes, configure-a corretamente para seu aplicativo:
-
Ativar modo persistente: Como (em relação a seus pares) cada instância de agente atua como um produtor ou um consumidor, redes de agentes não fornecem a replicação distribuída de mensagens. O primeiro agente que atua como um consumidor recebe uma mensagem e a mantém para armazenamento. Esse agente envia uma confirmação para o produtor e encaminha a mensagem para o próximo agente. Quando o segundo agente reconhece a persistência da mensagem, o primeiro agente exclui a mensagem.
Se o modo persistente é desativado, o primeiro agente reconhece o produtor sem manter a mensagem para armazenamento. Para obter mais informações, consulte Armazenamento de mensagem replicada
e Qual é a diferença entre entrega persistente e não persistente? na documentação do Apache ActiveMQ. -
Não desative mensagens de aviso para instâncias de agente: Para obter mais informações, consulte Mensagens de aviso
na documentação do Apache ActiveMQ. -
Não use a descoberta do agente multicast: O Amazon MQ não é compatível com a descoberta do agente usando multicast. Para obter mais informações, consulte Qual é a diferença entre a descoberta, multicast e zeroconf?
na documentação do Apache ActiveMQ.
Evite reinicializações lentas recuperando transações XA preparadas
O ActiveMQ oferece suporte a transações distribuídas (XA). Saber como o ActiveMQ processa transações XA pode ajudar a evitar tempos de recuperação mais lentos para reinicializações do agente e failovers no Amazon MQ.
Transações XA preparadas não resolvidas são reproduzidas novamente em cada reinicialização. Se elas permanecerem não resolvidas, o número de transações ficará cada vez maior com o tempo, aumentando significativamente o tempo necessário para inicializar o operador. Isso afeta o tempo de reinicialização e de failover. Você deve resolver essas transações com um commit()
ou um, de rollback()
para que não haja degradação de performance ao longo do tempo.
Para monitorar suas transações XA preparadas não resolvidas, você pode usar a JournalFilesForFastRecovery
métrica no Amazon CloudWatch Logs. Se esse número estiver aumentando ou for consistentemente maior que 1
, você deve recuperar suas transações não resolvidas com um código semelhante ao exemplo a seguir. Para obter mais informações, consulte Quotas in Amazon MQ.
O código de exemplo a seguir aborda transações XA preparadas e as encerra com um rollback()
.
import org.apache.activemq.ActiveMQXAConnectionFactory; import javax.jms.XAConnection; import javax.jms.XASession; import javax.transaction.xa.XAResource; import javax.transaction.xa.Xid; public class RecoverXaTransactions { private static final ActiveMQXAConnectionFactory ACTIVE_MQ_CONNECTION_FACTORY; final static String WIRE_LEVEL_ENDPOINT = "tcp://localhost:61616";; static { final String activeMqUsername = "
MyUsername123
"; final String activeMqPassword = "MyPassword456
"; ACTIVE_MQ_CONNECTION_FACTORY = new ActiveMQXAConnectionFactory(activeMqUsername, activeMqPassword, WIRE_LEVEL_ENDPOINT); ACTIVE_MQ_CONNECTION_FACTORY.setUserName(activeMqUsername); ACTIVE_MQ_CONNECTION_FACTORY.setPassword(activeMqPassword); } public static void main(String[] args) { try { final XAConnection connection = ACTIVE_MQ_CONNECTION_FACTORY.createXAConnection(); XASession xaSession = connection.createXASession(); XAResource xaRes = xaSession.getXAResource(); for (Xid id : xaRes.recover(XAResource.TMENDRSCAN)) { xaRes.rollback(id); } connection.close(); } catch (Exception e) { } } }
Em um cenário do mundo real, você pode verificar suas transações XA preparadas em relação ao Gerenciador de transações XA. Em seguida, você pode decidir se deseja tratar de cada transação preparada com um rollback()
ou um commit()
.