czwartek, 22 października 2015

[MessageQueues] ZeroMQ

Jest to technologia open source, cross platformowa, wbudowana w proces hosta (in-memory). API bazuje na programowaniu socketów. Nazwa ma reprezentować ideę "zero broker" - bez middleware w komunikacji.

Zero MQ jest wbudowaną biblioteką do messagingu. Jest łatwa do zintegrowania, pasuje do małych rozwiązań, ma niski koszt uruchomienia.

Jedną z wad jest to, że nie dostarcza wbudowanej serializacji, kompresji, szyfrowania i autentykacji. Nie może również zapewnić persystowania wiadomości na dysk. Dużą zaletą będzie szybkość przesyłania wiadomości, a co za tym idzie duża przepustowość.

Z poziomu języka C# mamy do dyspozycji clrzmq.dll (wrapper na libzmq.dll napisanej w C++). Bibliotekę najlepiej zainstalować za pomocą NuGeta.


Przykładowy kod wstawiający wiadomości do kolejki:

var context = new Context();

var socket = context.Socket(SocketType.PUSH);
socket.Connect("tcp://localhost:5400");

for(var i = 0; i < 1000; i++)
{
    socket.Send("message #" + i, Encoding.UTF8);
    System.Threading.Thread.Sleep(100);
}

Kod jest bardzo prosty, jednak metoda Send przyjmuje tylko stringi lub tablice bajtów, stąd konieczność serializacji obiektów "we własnym zakresie". Wiadomości przechowywane będą w pamięci procesu hostującego. Podobnie wygląda to po stronie odbierającej wiadomości:

var context = new Context();
var socket = context.Socket(SocketType.PULL);
socket.Bind("tcp://127.0.0.1:5400");

while (true)
{
    var message = socket.Recv(Encoding.UTF8);
    Console.WriteLine("processed " + message);
}

Warto zwrócić uwagę na to, że Bind nie działa dla adresu localhost, dlatego należy wpisać IP.

Context powinien być Singletonem. Tworzy on sockety i zapewnia komunikację międzyprocesową. Socket definiuje pattern komunikacyjny (PUSH,PULL,REQ,REP itd).

Brak komentarzy:

Prześlij komentarz