Table des matières
- Sixième partie : Les problèmes de consommation multiples des messages
-
- Qu'est-ce que l'identité
-
- L'identité dans les requêtes
-
- L'identité dans les files de messages
-
- Comment implémenter l'identité dans le code de la logique
-
- Modифика des paramètres de configuration au producteur
-
- Transmettre l'identité au consommateur
-
- Implémentation de la logique d'identité au niveau du consommateur
Sixième partie : Les problèmes de consommation multiples des messages
- Qu'est-ce que l'identité
L'identité : Plusieurs opérations ont un résultat cohérent. Pour les opérations non identitaires, Comment garantir l'identité ? — Utiliser un bloc de synchronisation distribué.
1) L'identité dans les requêtes
- get : Plusieurs get donnent un résultat cohérent
- post : Ajout, opération non identitaire
- put : Modifié, opération identitaire (selon l'identité)
- delete : Suppression, opération identitaire (selon l'identité)
Pour les opérations non identitaires, Nous devons garantir l'identité au niveau de la logique.
2) L'identité dans les files de messages
Dans les files de messages, Une messagerie peut être rediffusée à plusieurs consommateurs. Pour les opérations non identitaires, Par exemple, la création d'un compte, il faut garantir l'identité, sinon la messagerie sera consommée multiples fois. Utiliser un bloc de synchronisation distribué.
- Comment implémenter l'identité dans le code de la logique
1) Modif de paramètres de configuration au producteur
publisher-identify-type: correlated : Laisser le paramètre de confirmation de la requête inclure "spring_returned_message_correlation" dans l'en-tête de confirmation ; correlated : Laisser le paramètre de confirmation inclure "spring_returned_message_correlation" et la valeur dans le message de retour ; none : Ne faire aucunAck, le défaut
server:
port: 9090
spring:
rabbitmq:
host: 172.16.253.8
port: 5672
username: xiaoming
password: 123456
virtual-host: java2007
# # L'initialisation du confirm simple : simple exécution de ack ; correlated : exécution de ack avec portée de données ; none : ne faire aucun ack, le défaut
publisher-identify-type: correlated
# # L'initialisation du retour
# publisher-returns: true
2)Transmission de l'identité au producteur
@Test
public void testSendMessage(){
// Identité
String id = UUID.randomUUID().toString();
// Création de la données d'identité du message
CorrelationData correlationData = new CorrelationData(id);
// Envoi du message et portée de données de l'identité
rabbitTemplate.convertAndSend("my_boot_topic_exchange",
"product.add",
"hello message",
correlationData
);
}
3) Implémentation de la logique d'identité au niveau du consommateur
/**
* Exécution de la logique d'identité au niveau du consommateur
*/
@RabbitListener(queues = "my_boot_topic_queue")
public void processByMSG(Message message,Channel channel) throws IOException {
// Obtenir l'identité du message
String messageId = message.getMessageProperties().getHeader("spring_returned_message_correlation");
// Gestion du bloc de synchronisation distribué
Boolean lock = redisTemplate.opsForValue().setIfAbsent(messageId, 1,100000, TimeUnit.MILLISECONDS);
if(lock){
// Exécution de la consommation
System.out.println(" Ajout du utilisateur enregistré");
// Fermeture manuelle de l'ack
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
}else{
// Refus de la consommation
System.out.println(" Consommation déjà effectuée");
channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
}
}
tag1,tag2,tag3
MQ résoud les problèmes de consommation multiples des messages (5)
Table des matières
- Sixième partie : Les problèmes de consommation multiples des messages
- **1. Qu'est-ce que l'identité**
- **1) L'identité dans les requêtes**
- **- get : Plusieurs get donnent un résultat cohérent**
- **- post : Ajout, opération non identitaire**
- **- put : Modifié, opération identitaire (selon l'identité)**
- **- delete : Suppression, opération identitaire (selon l'identité)**
2) L'identité dans les files de messages
- **Dans les files de messages, Une messagerie peut être rediffusée à plusieurs consommateurs.**
- **Par exemple, la création d'un compte, il faut garantir l'identité, sinon la messagerie sera consommée multiples fois.**
- **Utiliser un bloc de synchronisation distribué.**
2. Comment implémenter l'identité dans le code de la logique
- **1) Modифика des paramètres de configuration au producteur**
- **publisher-identify-type: correlated**
- **Laisser le paramètre de confirmation de la requête inclure "spring\\\_returned\\\_message\\\_correlation" dans l'en-tête de confirmation ; correlated : Laisser le paramètre de confirmation inclure "spring\\\_returned\\\_message\\\_correlation" et la valeur dans le message de retour ; none : Ne faire aucunAck, le défaut**
2)Transmission de l'identité au producteur
- **Utiliser CorrelationData pour stocker l'identité**
- **Exemple de code Java**
3) Implémentation de la logique d'identité au niveau du consommateur
- **Utiliser un bloc de synchronisation distribué pour éviter la double consommation**
- **Exemple de code Java**
tag1,tag2,tag3