Middle+
Jaké kanály synchronizace byste použili k organizaci interakce mezi více službami?
sobes.tech AI
Odpověď od AI
Různé kanály synchronizace se používají pro interakci mezi více službami a jejich výběr závisí na požadavcích na spolehlivost, výkon, škálovatelnost a typ interakce (synchronní nebo asynchronní).
Hlavní kanály synchronizace:
- RESTful API: Synchronní komunikace přes protokol HTTP. Jednoduchá implementace, široce rozšířená. Vhodná pro požadavky "dotaz-odpověď".
// Příklad požadavku na REST API pomocí HttpClient import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class RestClientExample { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("http://example.com/api/resource")) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body()); } } - gRPC: Vysoce výkonná, synchronní komunikace s použitím Protocol Buffers. Efektivní pro přenos strukturovaných dat.
// Příklad volání gRPC služby (klientská část) // Vyžaduje kód generovaný z protobuf // managedChannel.build() // stub = YourServiceGrpc.newBlockingStub(channel); // Response response = stub.yourMethod(request); - Messaging (Message Queues): Asynchronní komunikace přes zprostředkovatele zpráv (např. Kafka, RabbitMQ, ActiveMQ). Zaručuje doručení zpráv, umožňuje implementaci vzorů Pub/Sub a Point-to-Point. Vhodné pro vysokou zátěž a oddělení služeb.
// Příklad odeslání zprávy do typické fronty JMS // Vyžaduje implementaci JMS (např. klient ActiveMQ) /* Context initialContext = new InitialContext(); QueueConnectionFactory cf = (QueueConnectionFactory) initialContext.lookup("ConnectionFactory"); QueueConnection conn = cf.createQueueConnection(); QueueSession session = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); Queue queue = (Queue) initialContext.lookup("MyQueue"); QueueSender sender = session.createSender(queue); TextMessage message = session.createTextMessage("Ahoj, světe!"); sender.send(message); sender.close(); session.close(); conn.close(); */ - Event Buses: Asynchronní komunikace založená na odesílání a zpracování událostí. Služby se přihlašují k typům událostí, které je zajímají. Podporuje slabé propojení. Implementuje se nad zprostředkovateli zpráv nebo specializovanými frameworky.
- Shared Database: Přímá interakce přes sdílenou databázi. Často považováno za anti-pattern v mikroservisní architektuře kvůli vysoké propojenosti a problémům s škálovatelností a nezávislostí nasazení. Může být použito v monolitických systémech nebo pro cachování dat.
Výběr konkrétního kanálu závisí na:
- Typu interakce: Synchronní (je potřeba okamžitá odpověď) nebo asynchronní (odpověď není okamžitá nebo může být později).
- Požadavcích na spolehlivost: Záruky doručení (alespoň jednou, maximálně jednou, přesně jednou).
- Výkonu a škálovatelnosti.
- Složitosti dat: Strukturovaná nebo nestrukturovaná.
- Oddělení služeb: Jak moc mají být služby nezávislé.