לאחרונה נתקלתי בתשתית Open Source להעברת מידע בשם ZeroMQ .חלקכם אולי מכירים אותה אבל אני מניח שרובכם לא, אם אתם נמנים עם החלק השני של האנשים אז הפוסט הזה מיועד לכם.
ZeroMQ נכתבה ב-C תחת רשיון LGPL Open Source אולם נכתבו לה Wrappers עבור שפות רבות כגון C++, C#, F#, Java, Node.js, Objective-C, Perl, PHP, Python, Ruby ועוד.
ממבט ראשון היא נראית כמו ספריה המכילה יכולות תקשורת אבל בעצם משמשת כתשתית אסינכרונית להעברת מידע בין Threads ו-Process באמצעות שימוש ב-Queues. היא מאפשרת לכם להעביר הודעות עד גודל 1GBבמגוון שכבות תקשורת כגון In-Process, TCP, Multicast. ניתן לחבר socket בין N ל-N משתמשים באמצעות שימוש ב- Pub-Sub, fanout, task distribution ו-Requst-Reply. חשוב להדגיש שהתשתית מהירה מאוד ואסינכרונית מה שמאפשר ליצור אפליקציות שניתן לבצע להן Scale up בכמעט אפס עבודה.
שילוב של API אינטואיטיבי, יעילות, דינמיות וביצועים מדהימים הופכים את התשתית למאוד אטרקטיבית למי שמעוניין להעביר מידע בקצבים גבוהים ביותר עם זמני תגובה מהירים.
Publisher – Subscriber
מתחשק לכם לעבוד בתצורת Publisher-Subscriber? אין בעיה, בדוגמא הבאה תראו כמה זה פשוט.
בשיטת העבודה של Publisher-Subscriber, יש לנו יצרן ומספר לקוחות שאמורים לקבל את המידע. כמתואר בדיאגרמה הבאה:
קודם כל נגדיר את ה-Publisher:
// Create the context which manage all sockets. Usually a single context for entire application
Context context = new ZMQ.Context();
// Create a socket of type publisher
Socket socket = context.Socket(SocketType.PUB);
// Bind to tcp with specified port
socket.Bind("tcp://*:5555");
// Just send the message you want.
socket.Send("Demo Hello World", Encoding.Unicode);
המילה הראשונה בהודעה שנשלחה היא בעצם ה-Topic של ההודעה שעל פיה מבצע ה-Subscriber רישום.
הגדרת ה-Subscriber :
// Again, create a context to hold the sockets
Context context = new ZMQ.Context();
// Create a socket of type subscriber
Socket socket = context.Socket(SocketType.SUB);
// Register the messages you are interested in
socket.Subscribe("Demo", Encoding.Unicode);
// Connect the producer
socket.Connect("tcp://localhost:5555");
// Wait for incoming messages
while (true)
{
var message = socket.Recv(Encoding.Unicode);
Console.WriteLine(message);
}
כמובן שישנם עוד שיטות שניתן להשתמש עם ZeroMQ :
Request-Response
שרת ולקוח המבצעים פעולת תישאול. לקוח פונה לשרת ומקבל ממנו תשובה
Ventilator
בשיטה הזו, יש לנו Ventilator שמחלק את העבודה בין workers שונים המסוגלים לבצע את העבודה במקביל. בסיום התהליך, ה-Workers שולחים את התוצרים ל-Sink.
דוגמאות קוד והסברים מעמיקים יותר ניתן למצוא באתר ZeroMQ.
Wrapper ל-#C ניתן למצוא כאן https://github.com/zeromq/clrzmq או באמצעות NuGet ע”י הוספת Package בשם clrzmq.