Un service peut être vu comme une interface sur:
Dans le cadre de gros systèmes d’information :
Liées aux processus métiers complexes
Gestion des messages
Persistance de l’état du processus
⚠️ Impact sur la conception ⚠️
Attention à la répartition (commit à 2 ou 3 phases)
Pas systématiquement de rollback
Tâche à exécuter de manière concurrente / parallèle
les tâches dont on dépend sont terminées ?
Points de vue différents sur une composition
Complémentaires
e.g. gestion d’un ticket dans un gestionnaire de bugs
Processus géré de manière distribuée
e.g. authentification type Kerberos,
paiement via une tierce partie
⇨ Représentation via diagramme de séquence
Suite d’actions correspondant au traitement d’une demande particulière
e.g. déroulé de la commande n°123456
Comment savoir si deux messages sont liés ?
Basé sur la manipulation et la transmission de messages métier
≠ catégories: canaux, routage, transformation, etc
Chaque message transmis 1 fois
≈ broadcast
Pour ne pas perdre de message
Synchrone
Le consommateur récupère explicitement le message avec un appel bloquant
Asynchrone
Le consommateur enregistre un callback
Similaire à synchrone vs asynchrone en programmation client/serveur
Aller au delà de REST / SOAP+HTTP
texte (JSON / XML + compression)
ou binaire:
Serializable
en Java)
Traitement composite de messages
Traduction de schéma
e.g. transmission via SOAP
Choix de la destination selon l’état du système
e.g. équilibrage de charge
Similaire au pipeline de services, mais avec une séquence qui dépend du contenu
Diviseur et aggrégateur peuvent être utilisés séparément.
Batch (attente, tri, traitement):
déclenchement sur quantité ou timeout
vs
Stream: file de priorité
Serveur / cluster
DSL à travers une API Java
pour assembler des EIPs
CamelContext context = new DefaultCamelContext();
context.addRoutes(new RouteBuilder() {
public void configure() {
from("test-jms:queue:test.queue")
.to("bean:validateOrder")
.to("file://test");
}
});
DSL XML
pour assembler des EIPs
<route>
<from uri="jms:queue:order"/>
<to uri="bean:validateOrder"/>
<to uri="mina:tcp://mainframeip:4444?textline=true"/>
<to uri="bean:sendConfirmEmail"/>
</route>
Composants/EIP en CAMEL
=
préfixe de l’URL
⇒ 280 composants listés sur le site Web
Similaire à Apache Camel
DSL XML & Java
Serveur de transmission de messages
Queues & Topics
Distribution (sharding)
Persistence des messages
Implémenté en Erlang (lng fonctionnel)
Facilement déployable via Docker
Interface de monitoring (management
)
Nombreux langages supportés via AMQP
Intégration dans de nombreux frameworks:
e.g. Camel, Spring, etc
Connection
: abstraction sur la communication réseau (socket, authentification, etc)Channel
: composant de gestion des messagesQueue
: re-déclarableChannel.basicPublish
: envoyer un messageConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME,
false, false, false, null);
// do some work
}
c.f. tutoriel
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null,
message.getBytes(StandardCharsets.UTF_8));
System.out.println(" [x] Sent '" + message + "'");
c.f. tutoriel
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
c.f. tutoriel
RabbitTemplate
pour gérer les messages
convertAndSend(queueName, msg)
pour envoyer@RabbitListener(queues)
sur une classe pour recevoir
@RabbitHandler
sur la méthode de réceptionpublic class Tut1Sender {
@Autowired
private RabbitTemplate template;
@Scheduled(fixedDelay = 1000, initialDelay = 500)
public void send() {
String message = "Hello World!";
this.template.convertAndSend("hello", message);
System.out.println(" [x] Sent '" + message + "'");
}
}
c.f. tutoriel
@RabbitListener(queues = "hello")
public class Tut1Receiver {
@RabbitHandler
public void receive(String in) {
System.out.println(" [x] Received '" + in + "'");
}
}
c.f. tutoriel