Sobes.tech
Middle+

Quais canais de sincronização você usaria para organizar a interação entre vários serviços?

sobes.tech IA

Resposta da IA

Para a interação entre vários serviços, são utilizados diferentes canais de sincronização, cuja escolha depende dos requisitos de fiabilidade, desempenho, escalabilidade e do tipo de interação (síncrona ou assíncrona).

Canais principais de sincronização:

  1. API RESTful: Interação síncrona através do protocolo HTTP. Fácil de implementar, amplamente utilizado. Adequado para pedidos de "requisição-resposta".
    // Exemplo de pedido à API REST usando 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: Interação síncrona e de alto desempenho usando Protocol Buffers. Eficaz para transmitir dados estruturados.
    // Exemplo de chamada a um serviço gRPC (parte cliente)
    // Em código real, é necessário código gerado por protobuf.
    // managedChannel.build()
    // stub = YourServiceGrpc.newBlockingStub(channel);
    // Response response = stub.yourMethod(request);
    
  3. Mensageria (Filas de mensagens): Interação assíncrona através de um broker de mensagens (por exemplo, Kafka, RabbitMQ, ActiveMQ). Garante a entrega de mensagens, permite implementar padrões Pub/Sub e Ponto a Ponto. Adequado para cargas elevadas e desacoplamento de serviços.
    // Exemplo de envio de mensagem a uma fila JMS típica
    // Requer implementação JMS (por exemplo, cliente 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("Hello, World!");
    sender.send(message);
    
    sender.close();
    session.close();
    conn.close();
    */
    
  4. Buses de eventos: Interação assíncrona baseada no envio e processamento de eventos. Os serviços subscrevem-se aos tipos de eventos que lhes interessam. Promove um acoplamento fraco. Implementa-se sobre brokers de mensagens ou frameworks especializados.
  5. Base de dados partilhada: Interação direta através de uma base de dados comum. Frequentemente considerada uma antipattern na arquitetura de microserviços devido ao seu forte acoplamento e problemas de escalabilidade e independência de implantação. Pode ser usada em monólitos ou para cache de dados.

A escolha de um canal específico depende de:

  • Tipo de interação: Síncrona (resposta imediata necessária) ou assíncrona (resposta não requerida imediatamente ou pode ser obtida mais tarde).
  • Requisitos de fiabilidade: Garantias de entrega (pelo menos uma vez, no máximo uma vez, exatamente uma vez).
  • Desempenho e escalabilidade.
  • Complexidade dos dados: Estruturados ou não estruturados.
  • Desacoplamento de serviços: Quão independentes os serviços devem ser.