Sobes.tech
Middle+

Aké kanály synchronizácie by ste použili na organizáciu interakcie medzi viacerými službami?

sobes.tech AI

Odpoveď od AI

Rôzne kanály synchronizácie sa používajú na interakciu medzi viacerými službami a ich výber závisí od požiadaviek na spoľahlivosť, výkon, škálovateľnosť a typ interakcie (synchronná alebo asynchrónna).

Hlavné kanály synchronizácie:

  1. RESTful API: Synchronná komunikácia cez protokol HTTP. Jednoduchá implementácia, široko rozšírená. Vhodná pre požiadavky "dopyt-odpoveď".
    // Príklad požiadavky na REST API pomocou 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: Vysoko výkonná, synchronná komunikácia s použitím Protocol Buffers. Efektívne pre prenos štruktúrovaných dát.
    // Príklad volania gRPC služby (klientskej časti)
    // Vyžaduje kód generovaný z protobuf
    // managedChannel.build()
    // stub = YourServiceGrpc.newBlockingStub(channel);
    // Response response = stub.yourMethod(request);
    
  3. Messaging (Message Queues): Asynchrónna komunikácia cez sprostredkovateľa správ (napr. Kafka, RabbitMQ, ActiveMQ). Zaručuje doručenie správ, umožňuje implementáciu vzorov Pub/Sub a Point-to-Point. Vhodné pre vysokú záťaž a oddelenie služieb.
    // Príklad odoslania správy do typickej JMS fronty
    // Vyžaduje implementáciu JMS (napr. ActiveMQ klient)
    /*
    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, svet!");
    sender.send(message);
    
    sender.close();
    session.close();
    conn.close();
    */
    
  4. Event Buses: Asynchrónna komunikácia založená na odosielaní a spracovaní udalostí. Služby sa prihlásia na typy udalostí, ktoré ich zaujímajú. Podporuje slabé prepojenie. Implementuje sa nad sprostredkovateľmi správ alebo špeciálnymi rámcami.
  5. Shared Database: Priama interakcia cez spoločnú databázu. Často sa považuje za anti-pattern v mikroservisnej architektúre kvôli vysokej prepojenosti a problémom so škálovateľnosťou a nezávislosťou nasadenia. Môže sa použiť v monolitických systémoch alebo na cacheovanie dát.

Výber konkrétneho kanála závisí od:

  • Typu interakcie: Synchronná (je potrebná okamžitá odpoveď) alebo asynchrónna (odpoveď nie je okamžitá alebo môže byť získaná neskôr).
  • Požiadaviek na spoľahlivosť: Záruky doručenia (aspoň raz, najviac raz, presne raz).
  • Výkonu a škálovateľnosti.
  • Zložitosti dát: Štruktúrované alebo nestruktúrované.
  • Oddelenia služieb: Do akej miery majú byť služby nezávislé.