Thực hành lập trình với thư viện ZeroMQ NetMQ

    0

    Trong bài học này chúng ta sẽ làm quen với cách lập trình với thư viện ZeroMQ. Đây là một bộ thư viện kích thước nhỏ, tốc độ truyền dữ liệu rất cao, và cũng được sử dụng rất phổ biến để phát triển các ứng dụng mạng phân tán và IoT. 

    Trên nền tảng .NET, thư viện ZeroMQ được thực thi và cung cấp dưới dạng gói NuGet có tên gọi là NetMQ. Chúng ta cùng thực hiện một bài thực hành nhỏ để nắm được ý tưởng chung về bộ thư viện này.

    Xây dựng ứng dụng theo mô hình truy vấn / phản hồi

    Bước 1. Tạo một solution trống. Trong solution này tạo 2 dự án cùng kiểu ConsoleApp, lần lượt đặt tên là Client và Server.

    Bước 2. Cài đặt thư viện NetMQ cho cả Client và Server. Để cài đặt, click phải chuột vào tên solution và chọn Manage NuGet Packages for Solution. Mở tab Browse và tìm kiếm “netmq”. Trong danh sách kết quả click chọn gói NetMQ. Trong danh sách dự án click chọn cả Client và Server rồi ấn Install. 

    Nếu cài đặt thành công, bạn kiểm tra cửa sổ Solution sẽ thu được như sau:

    Bước 3. Viết code cho file Program.cs của dự án Server như sau:

    using NetMQ;
    using NetMQ.Sockets;
    
    using static System.Console;
    
    internal class Program {
        private static void Main(string[] args) {
            ReqRes_Server();        
        }
    
        static void ReqRes_Server() {
            WriteLine("-- ZeroMQ server --");
            using var server = new ResponseSocket();
            server.Bind("tcp://*:1308");
            while (true) {
                string message = server.ReceiveFrameString();
                WriteLine($"#Request: {message}");
                server.SendFrame($"Hi, this is server response. It's {DateTime.Now}");
            }
        }    
    }
    

    Bước 4. Viết code cho file Program.cs của dự án Client như sau:

    using NetMQ;
    using NetMQ.Sockets;
    
    using static System.Console;
    
    internal class Program {
        private static void Main(string[] args) {
            ReqRes_Client();        
        }
    
        static void ReqRes_Client() {
            WriteLine("-- ZeroMQ client --");
            using var client = new RequestSocket();
            client.Connect("tcp://127.0.0.1:1308");
            while (true) {
                Write("Request >>> ");
                var request = ReadLine();
                client.SendFrame(request);
                var message = client.ReceiveFrameString();
                WriteLine($"#Responsed: {message}\r\n");
            }
        }    
    }
    

    Bước 5. Chạy thử nghiệm. Thiết lập solution để chạy debug đồng thời cả hai dự án. Chúng ta thu được kết quả như sau:

    Đây là một ứng dụng mạng đơn giản hoạt động theo mô hình truy vấn / phản hồi quen thuộc, tương tự những gì chúng ta đã thực hiện ở chương Lập trình socket.

    Quay trở lại giao diện Visual Studio và chạy debug thêm một bản nữa của Client (tức là chạy 2 client và 1 server), chúng ta thu được kết quả như sau:

    Hai chương trình client này hoạt động độc lập với nhau và cùng tương tác với một server chung.

    Như vậy có thể thấy, ZeroMQ (NetMQ) tạo ra đúng mô hình truy vấn phản hồi trong ứng dụng theo kiến trúc chủ / khách, tương tự như cách HTTP và hệ thống web hoạt động.

    Xây dựng ứng dụng theo mô hình xuất bản / đăng ký

    Tiếp theo đây chúng ta sẽ xây dựng một ứng dụng mạng khác hoạt động theo mô hình xuất bản / đăng ký (publish / subscribe) sử dụng NetMQ.

    Bước 1. Chuẩn bị dự án. Tạo một solution trống với hai dự án ConsoleApp đặt tên lần lượt là Publisher và Subscriber. Sau đó cài đặt thư viện NetMQ cho cả hai dự án này. Cách làm tương tự như trong ví dụ trước.Bước 2. Viết code cho publisher, file Program.cs, như sau:

    using NetMQ;
    using NetMQ.Sockets;
    
    using static System.Console;
    
    internal class Program {
        private static void Main(string[] args) {
            PubSub_Publisher();
        }
    
        static void PubSub_Publisher() {
            WriteLine("-- ZeroMQ publisher --");
            using var publisher = new PublisherSocket();
            publisher.Bind("tcp://*:1308");
            while (true) {
                Write("Publish >>> ");
                var message = ReadLine();
                publisher
                    .SendMoreFrame("hello_topic") // Topic
                    .SendFrame(message); // Message
            }
        }
    }
    

    Bước 3. Viết code cho Subscriber, file Program.cs, như sau:

    using NetMQ;
    using NetMQ.Sockets;
    
    using static System.Console;
    
    internal class Program {
        private static void Main(string[] args) {        
            PubSub_Subscriber();
        }
    
        static void PubSub_Subscriber() {
            WriteLine("-- ZeroMQ subscriber --");
            using var subscriber = new SubscriberSocket();
            subscriber.Connect("tcp://127.0.0.1:1308");
            subscriber.Subscribe("hello_topic");
            while (true) {
                var topic = subscriber.ReceiveFrameString();
                var message = subscriber.ReceiveFrameString();
                WriteLine("#Received: {0} {1}", topic, message);
            }
        }
    }
    

    Bước 4. Chạy thử nghiệm. Thiết lập solution để chạy debug đồng thời cả hai dự án. Chúng ta thu được kết quả như sau:

    Trong ứng dụng này, Publisher phát đi các thông điệp theo chủ đề “hello_topic”, Subscriber đăng ký nhận thông điêp theo đúng chủ đề này. Mô hình này tạo ra truyền thông một chiều từ Publisher sang Subscriber.

    Giờ quay trở lại Visual Studio và chạy debug thêm một bản nữa của Subscriber (tức là 1 Publisher và 2 Subscriber), chúng ta thu được kết quả như sau:

    Như vậy, chúng ta có thể thấy, một Publisher thực sự có thể đồng thời truyền thông điệp đến nhiều Subscriber. Một điều khác biệt (so với MQTT) là các Subscriber kết nối trực tiếp đến Publisher chứ không kết nối với một broker trung gian.

    + Nếu bạn thấy site hữu ích, trước khi rời đi hãy giúp đỡ site bằng một hành động nhỏ để site có thể phát triển và phục vụ bạn tốt hơn.
    + Nếu bạn thấy bài viết hữu ích, hãy giúp chia sẻ tới mọi người.
    + Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần thảo luận cuối trang.
    Cảm ơn bạn!

    Kết luận

    Trong bài học này chúng ta cùng làm quen với ZMQ và bản thực thi NetMQ trên .NET thông qua thực hiện một số ví dụ nhỏ. Có thể nhận xét rằng, ZMQ và NetMQ rất dễ sử dụng so với MQTT. Thư viện này cũng hỗ trợ nhiều mô hình trao đổi thông điệp khác nhau.

    Trong bài học tiếp theo chúng ta sẽ tìm hiểu kỹ hơn về ZMQ cũng như cách làm việc với thư viện NetMQ.

    Theo dõi
    Thông báo của
    guest

    0 Thảo luận
    Phản hồi nội tuyến
    Xem tất cả bình luận