Sobes.tech
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:

  1. 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());
        }
    }
    
  2. 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);
    
  3. 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();
    */
    
  4. 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.
  5. 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é.