terça-feira, 4 de fevereiro de 2014

ZeroMQ: Introdução com Request/Reply Síncrono

Um dos frameworks mais legais para auxiliar no desenvolvimento de soluções distribuídas que conheço é o ZeroMQ (http://zeromq.org/). Empresas grandes o utilizam (AT&T, Microsoft, etc.), mas, por alguma razão que desconheço, nunca ouvi ninguém falar dele nas empresas onde trabalhei.

O ZeroMQ é uma biblioteca bem fácil de se trabalhar que abstrai os detalhes sórdidos de se trabalhar com sockets e é voltado a padrões de integração (Pub/Sub, Request/Reply, Push/Pull, etc.).

O intuito deste post é lhe inspirar a pesquisar mais sobre o ZeroMQ demonstrando um exemplo bem comum e legal: fazer uma requisição e obter uma resposta usando dois projetos em C# do tipo console.

Reply

Primeiramente, crie um projeto do tipo console em C# -- eu usei a versão 4.5 do .NET -- e de o nome de zeromq.testes.reply ou qualquer outro que quiser. Agora, vamos importar a referência do ZeroMQ pelo NuGet: install-package clrzmq

Dentro do método Main, cole o seguinte trecho de código:

Console.Title = "Replier";

using (var context = new Context())
using (var socket = context.Socket(SocketType.REP))
{
 socket.Bind("tcp://*:5555");

 while (true)
 {
  var requisição = socket.Recv(Encoding.UTF8);
  Console.WriteLine("respondendo à requisição: '{0}'", requisição);
  var resposta = string.Format("resposta à requisição: '{0}'", requisição);
  socket.Send(resposta, Encoding.UTF8);
 }
}

O trecho de código acima corresponde ao "servidor" que responde à requisições.

Request

Agora, crie um projeto do mesmo tipo do anterior e dê o nome de zeromq.testes.request. Como anteriormente, faça referência ao ZeroMQ via NuGet: install-package clrzmq

O método Main deve conter algo como o trecho a seguir.

Console.Title = "Requestor";

using (var context = new Context())
using (var socket = context.Socket(SocketType.REQ))
{
 socket.Connect("tcp://127.0.0.1:5555");

 while (true)
 {
  var requisição = Guid.NewGuid().ToString();
  socket.Send(requisição, Encoding.UTF8);
  Console.WriteLine("--------------------------------");
  Console.WriteLine("requisição enviada: {0}", requisição);
  var resposta = socket.Recv(Encoding.UTF8);
  Console.WriteLine("resposta: {0}", resposta);
  Thread.Sleep(1000);
 }
}

Testando o Projeto

Agora execute os dois projetos ao mesmo tempo. Se tudo deu certo, duas telinhas de console devem aparecer com algumas mensagens definidas de segundo em segundo. Eu não expliquei os detalhes propositalmente para te desafiar a procurar saber o que está acontecendo. Acredito que aprendemos mais quando somos curiosos e investigativos.

Gostou? Procure saber mais sobre essa biblioteca. E se sua linguagem de programação preferida não for o .NET, existem APIs para o ZeroMQ para todas as linguagens mais conhecidas (e desconhecidas também).

Importante!

Todo o exemplo acima usa uma versão antiga do clrzmq. Quando estiver confortável com o ZeroMQ, você deveria usar a versão mais recente que pode ser obtida usando a chave "-pre" na hora de instalar via NuGet (install-package clrzmq -pre).

Nenhum comentário:

Postar um comentário