Trong bài học này chúng ta sẽ cùng tìm hiểu một số vấn đề chi tiết về thư viện ZeroMQ.
Thư viện ZMQ
ZMQ, 0MQ, ØMQ là các tên gọi khác nhau của cùng một thư viện mã mở hỗ trợ truyền thông điệp để xây dựng các ứng dụng mạng phân tán với tên gọi chính thức là ZeroMQ.
Mục tiêu của ZeroMQ là: giảm thiểu sự phức tạp và chi phí của việc phát triển và triển khai các ứng dụng mạng phân tán; cho phép các ứng dụng truyền tải thông điệp một cách đáng tin cậy, nhanh chóng, bảo mật và hiệu quả.
Triết lý của ZeroMQ gắn với số không: không có broker, độ trễ bằng không, chi phí bằng không (miễn phí) và không quản trị.
Lõi của thư viện ZMQ được xây dựng trên C và có tên gọi là libzmq. Một số ngôn ngữ không trực tiếp thực thi ZMQ mà tạo ra wrapper cho thư viện libzmq. Một số ngôn ngữ khác (như Java, C#) thực thi lại thư viện này.
Hiện nay ZMQ có thể sử dụng trên nhiều ngôn ngữ lập trình với nhiều thư viện thực thi khác nhau, như C (libzmq, czmq), C++ (zmqpp, cppzmq, azmq, czmqpp, fbzmq), Python (Pyzmq), Java (JeroMQ, JZMQ, jczmq), Ruby (rbzmq), C# (NetMQ, clrzmq).
Tùy thuộc vào ngôn ngữ, nền tảng và cách thực thi, ZMQ có thể có những tính năng khác nhau. Ví dụ, cùng thực thi trên .NET nhưng clrzmq cho phép sử dụng cả dịch vụ giao vận của TCP và UDP, trong khi NetMQ chỉ sử dụng TCP.
Trên nền tảng .NET, thực thi thư viện ZMQ phổ biến nhất là NetMQ. Thư viện này được đóng thành gói NuGet có tên gọi là NetMQ. Do .NET hoạt động trên nhiều nền tảng, thư viện NetMQ có thể sử dụng để phát triển ứng dụng cho cả Windows, Linux, MacOS, Android, IOS.
Mô hình truyền thông điệp trong ZMQ
ZMQ sử dụng dịch vụ giao vận của TCP. ZMQ xây dựng và khai thác một giao thức ứng dụng riêng có tên gọi ZeroMQ Message Transport Protocol (ZMTP). ZMTP sử dụng giao thức giao vận TCP. ZMTP là giao thức được tối ưu cho tốc độ truyền thông.
ZMTP hỗ trợ nhiều mô hình truyền thông điệp và là một điểm đặc biệt của ZMQ. Do hỗ trợ nhiều mô hình truyền thông điệp, chúng ta có thể sử dụng ZMQ trong nhiều loại ứng dụng khác nhau.
ZMQ hỗ trợ các mô hình như:
- Mô hình publish-subscribe: đây cũng là mô hình được sử dụng bởi MQTT. Tuy nhiên, mô hình publish-subscribe trong ZMQ không sử dụng chương trình broker riêng. Một trong số các ứng dụng sẽ đóng vai trò publisher. Các ứng dụng khác đóng vai trò subscriber và kết nối đến publisher. ZMQ cũng hỗ trợ một mô hình mở rộng của publish / subscribe, gọi là XSub / XPub, với nhiều publisher và nhiều subscriber.
- Mô hình request-reply: còn gọi là mô hình request / response hay client / server. Đây là mô hình thường gặp trong các giao thức truyền thống như HTTP.
- Mô hình pipeline: còn gọi là mô hình push-pull. Trong mô hình này, các ứng dụng được tổ chức theo một chiều liên tiếp từ nguồn đến đích, tương tự như một đường ống (pipeline) dẫn dầu từ mỏ dầu đến nhà máy lọc dầu.
So sánh MQTT và ZMQ
Cả MQTT và ZMQ đều là những giao thức nổi tiếng và phổ biến trong IoT. Hai giao thức đều có ưu và nhược điểm riêng. Chúng ta sẽ cùng làm rõ một số điểm khác biệt giữa hai giao thức này.
Về mô hình truyền thông điệp, MQTT chỉ hỗ trợ duy nhất mô hình publish / subscribe, ZeroMQ hỗ trợ các mô hình publish / subscribe, request / response, push / pull.
MQTT bắt buộc phải sử dụng một phần mềm broker riêng. Thông điệp không được chuyển trực tiếp giữa các client mà thực tế được chuyển tiếp tại broker. ZeroMQ không sử dụng broker hay bất kỳ phần mềm trung gian nào. Các client trong ZeroMQ kết nối và trao đổi thông điệp trực tiếp.
Về giao thức giao vận, cả MQTT và ZeroMQ đều sử dụng dịch vụ TCP. Do vậy, cả hai đều khai thác được dịch vụ truyền tin cậy hướng liên kết của TCP.
MQTT bổ sung thêm 2 mức độ chất lượng dịch vụ, bên cạnh khả năng đảm bảo chất lượng dịch vụ của TCP. ZeroMQ không cung cấp đảm bảo chất lượng dịch vụ bổ sung.
ZMQ và socket
Có một vấn đề chúng ta đã nhận thấy trong phần thực hành: ZMQ cũng sử dụng khái niệm socket. Các class chúng ta đã từng sử dụng đều được gọi là socket, như RequestSocket, ResponseSocket, PublisherSocket, SubscriberSocket.
Cần phân biệt ZMQ socket với Socket thông thường.
Socket là API tiêu chuẩn thực tế để lập trình mạng. Chúng ta đã học cách lập trình trực tiếp với ba loại socket (TCP, UDP, IP) ở chương 2.
ZeroMQ cũng sử dụng khái niệm socket và cũng tạo ra các API để hỗ trợ lập trình mạng. Tuy nhiên, socket trong ZeroMQ là sự trừu tượng hóa của một hàng đợi của các thông điệp không đồng bộ. Ý nghĩa của hàng đợi tùy thuộc vào loại socket ZeroMQ đang sử dụng. Các thông điệp được đưa vào hàng đợi và xử lý tự động.
Socket của ZeroMQ truyền các thông điệp rời rạc. Trên thực tế, ZeroMQ cũng vẫn phải sử dụng đến Socket API thông thường để thực hiện truyền thông mạng. Tuy nhiên, ZeroMQ hoàn toàn che đi những chi tiết liên quan đến Socket API.
ZMQ socket hoạt động theo kiểu không đồng bộ. Việc thiết lập kết nối, hủy kết nối, và kết nối lại được kiểm soát và xử lý bởi ZMQ. Người lập trình không cần quản lý quá trình này.
Mỗi socket ZMQ có thể đồng thời kết nối tới nhiều socket ZMQ khác. Do đó ZMQ socket cho phép thực hiện nhiều mô hình truyền thông khác nhau, từ một – một (như Socket API), nhiều – một (nhiều máy khách – một máy chủ), hoặc một – nhiều (multicast).
+ 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 đã làm quen với một số chi tiết về bộ thư viện ZeroMQ.
Nếu bạn đang bắt đầu với ZMQ, bạn nên tìm hiểu các tài liệu hướng dẫn và thực hành để nắm vững các khái niệm cơ bản và có thể sử dụng ZMQ một cách hiệu quả trong ứng dụng của mình.