Thứ sáu, 27/12/2013 | 00:00 GMT+7

Cách làm việc với Thư viện nhắn tin ZeroMQ

Có nhiều cách bạn có thể chọn để mô tả ZeroMQ; tuy nhiên, nó vẫn như những gì nó thực sự là: một thư viện giao tiếp thực sự đáng chú ý, mang lại lợi ích rất nhiều cho các nhà phát triển với bộ tính năng phong phú và hoàn thiện của nó.


Trong phần thứ hai này của các bài viết về DigitalOcean ZeroMQ, tiếp theo phần trước của ta về cài đặt ứng dụng, ta sẽ đi sâu vào việc sử dụng nó và khám phá các cách để thực sự triển khai thư viện nhanh và mạnh mẽ này. Ta sẽ thực hiện theo cách của ta thông qua các ví dụ khác nhau được chia thành các phần kế tiếp, bắt đầu với thông điệp đơn giản giữa các quy trình (tức là sử dụng mẫu yêu cầu / phản hồi).

Lưu ý: Bài viết này là phần thứ hai của ta về chủ đề này. Nếu bạn muốn tìm hiểu thêm về nó (tức là nó là gì và nó như thế nào so với một trình message broker hoàn chỉnh), hãy xem Giới thiệu và Cách cài đặt ZeroMQ trước khi đọc hướng dẫn này.

Trong khoảng


ZeroMQ


ZeroMQ là một thư viện được sử dụng để triển khai các hệ thống nhắn tin và liên lạc giữa các ứng dụng và quy trình - nhanh chóng và không đồng bộ.

Nếu bạn đã từng có kinh nghiệm với các giải pháp nhắn tin ứng dụng khác như RabbitMQ, có thể sẽ gặp một chút khó khăn khi hiểu vị trí chính xác của ZeroMQ.

Khi so sánh với một số dự án lớn hơn nhiều, cung cấp tất cả các phần cần thiết của nhắn tin doanh nghiệp, ZeroMQ vẫn chỉ là một công cụ nhẹ và nhanh chóng để tạo ra cho riêng bạn.

Bài viết này


Mặc dù về mặt kỹ thuật không phải là một khuôn khổ, với chức năng và vị trí quan trọng của nó đối với các việc mà nó giải quyết, bạn có thể coi ZeroMQ là xương sống để triển khai lớp giao tiếp thực tế của ứng dụng của bạn.

Trong bài viết này, ta mong muốn cung cấp cho bạn một số ví dụ để truyền cảm hứng cho bạn về tất cả những điều bạn có thể làm.

Lưu ý: Ta sẽ làm việc với ngôn ngữ Python và trình thông dịch cổ điển của nó (trình thông dịch Python C) trong các ví dụ của ta . Sau khi cài đặt các ràng buộc ngôn ngữ cần thiết, bạn có thể chỉ cần dịch mã và sử dụng ngôn ngữ yêu thích của bạn mà không gặp bất kỳ vấn đề gì. Nếu bạn muốn tìm hiểu về cách cài đặt Python trên CentOS VPS, hãy xem hướng dẫn Cách cài đặt Python 2.7 trên CentOS 6.4 của ta .

Lập trình với ZeroMQ


ZeroMQ như một thư viện hoạt động thông qua các socket bằng cách tuân theo các mẫu giao tiếp mạng nhất định. Nó được thiết kế để hoạt động không đồng bộ và đó là nơi xuất phát hậu tố MQ trong tên của nó - từ các tin nhắn xếp hàng trước khi gửi chúng.

Các loại socket ZeroMQ


ZeroMQ khác ở cách thức hoạt động của các socket . Không giống như cách hoạt động đồng bộ của các socket thông thường, việc triển khai socket của ZeroMQ “trình bày một cách trừu tượng của hàng đợi thông báo không đồng bộ”.

Cách thức hoạt động của các socket này phụ thuộc vào loại socket được chọn. Và stream tin nhắn được gửi phụ thuộc vào các mẫu đã chọn, trong đó có bốn mẫu:

  • Dạng Yêu cầu / Trả lời: Được sử dụng để gửi một yêu cầu và nhận các câu trả lời tiếp theo cho mỗi yêu cầu được gửi.

  • Dạng Xuất bản / Đăng ký: Được sử dụng để phân phối dữ liệu từ một quá trình (ví dụ: nhà xuất bản) cho nhiều người nhận (ví dụ: người đăng ký).

  • Mô hình đường ống: Được sử dụng để phân phối dữ liệu đến các node được kết nối.

  • Mô hình cặp độc quyền: Được sử dụng để kết nối hai đồng nghiệp với nhau, tạo thành một cặp.

Các loại vận tải ZeroMQ


ZeroMQ cung cấp bốn loại phương tiện giao thông khác nhau để liên lạc.Đó là:

  • In-Process (INPROC): Vận chuyển thông tin liên lạc local (trong quá trình).

  • Inter-Process (IPC): Vận chuyển thông tin liên lạc local (giữa các quá trình).

  • TCP: Truyền tải thông tin liên lạc Unicast sử dụng TCP.

  • PGM: Truyền thông đa phương tiện sử dụng PGM.

Cấu trúc các ứng dụng ZeroMQ


ZeroMQ hoạt động khác với các cài đặt giao tiếp thông thường và truyền thống. Nó có thể có một trong hai phía của liên kết (tức là server hoặc client ) liên kết và chờ kết nối. Không giống như các socket tiêu chuẩn, ZeroMQ hoạt động dựa trên khái niệm biết rằng một kết nối có thể xảy ra và do đó, có thể đợi nó hoàn toàn tốt.

Cấu trúc Máy khách - Server


Để cấu trúc mã client và server của bạn, tốt nhất bạn nên quyết định và chọn một mã ổn định hơn làm bên ràng buộc và (các) bên kia làm phần kết nối .

Thí dụ:

Server Application                           Client Application ---------------------[ < .. < .. < .. < .. ...................... Bound -> Port:8080                          Connects <- Port:8080 

Máy khách - Proxy - Cấu trúc server


Để giải quyết các vấn đề gây ra bởi cả hai đầu của giao tiếp đều ở trạng thái động (do đó không ổn định), ZeroMQ cung cấp các thiết bị kết nối mạng (tức là đồ dùng ngoài hộp). Các thiết bị này kết nối với hai cổng khác nhau và định tuyến các kết nối qua.

  • Streamer: Một thiết bị streamer cho các giao tiếp song song được kết nối.
  • Forwarder: Một thiết bị chuyển tiếp cho giao tiếp pub / sub.
  • Hàng đợi: Một thiết bị chuyển tiếp cho các giao tiếp yêu cầu / trả lời.

Thí dụ:

   Server App.            Device | Forward           Client App.   ............ > .. > . ]------------------[ < .. < .. .........     Connects               2 Port Binding             Connects 

Ví dụ về lập trình


Sử dụng kiến thức của ta từ phần trước, bây giờ ta sẽ bắt đầu sử dụng chúng để tạo các ứng dụng đơn giản.

Lưu ý: Các ví dụ dưới đây thường bao gồm các ứng dụng chạy đồng thời. Ví dụ, để cài đặt client / server hoạt động, bạn cần có cả ứng dụng client và server chạy cùng nhau. Một trong những cách để làm điều này là sử dụng công cụ Linux Screen. Để tìm hiểu thêm về nó, hãy xem Hướng dẫn DigitalOceanTutorial này. Để cài đặt màn hình trên hệ thống CentOS, hãy nhớ rằng bạn có thể chỉ cần chạy: yum install -y screen .

Nhắn tin đơn giản bằng cách sử dụng mẫu yêu cầu / trả lời


Về giao tiếp giữa các ứng dụng, mẫu yêu cầu / trả lời có lẽ tạo thành mẫu cổ điển tuyệt đối và cho ta cơ hội tốt để bắt đầu với những kiến thức cơ bản cơ bản của ZeroMQ.

Trường hợp sử dụng:

  • Đối với các giao tiếp đơn giản giữa server và (các) client .

  • Kiểm tra thông tin và yêu cầu cập nhật.

  • Gửi kiểm tra và cập nhật đến server .

  • Echo hoặc ping / pong triển khai.

(Các) loại socket được sử dụng:

  • zmq.REP
  • zmq.REQ

Ví dụ về server : server.py


Tạo “server.py” bằng nano ( nano server.py ) và dán nội dung tự giải thích bên dưới.

import zmq  # ZeroMQ Context context = zmq.Context()  # Define the socket using the "Context" sock = context.socket(zmq.REP) sock.bind("tcp://127.0.0.1:5678")  # Run a simple "Echo" server while True:     message = sock.recv()     sock.send("Echo: " + message)     print "Echo: " + message 

Khi bạn chỉnh sửa xong, hãy lưu và chỉnh sửa bằng cách nhấn CTRL + X sau đó nhấn Y.

Ví dụ về khách hàng: client.py


Tạo một “client.py” bằng nano ( nano client.py ) và dán các nội dung bên dưới.

import zmq import sys  # ZeroMQ Context context = zmq.Context()  # Define the socket using the "Context" sock = context.socket(zmq.REQ) sock.connect("tcp://127.0.0.1:5678")  # Send a "message" using the socket sock.send(" ".join(sys.argv[1:])) print sock.recv() 

Khi bạn chỉnh sửa xong, hãy lưu và thoát bằng cách nhấn CTRL + X sau đó nhấn Y.

Lưu ý: Khi làm việc với thư viện ZeroMQ, hãy nhớ rằng mỗi stream được sử dụng để gửi một tin nhắn (tức là .send(..) ) mong đợi một .recv(..) theo sau. Không thực hiện cặp sẽ gây ra ngoại lệ.

Sử dụng


server.py của ta được cài đặt để hoạt động như một ứng dụng “tạo tiếng vang”. Bất cứ thứ gì ta chọn gửi đến nó, nó sẽ gửi lại nó (ví dụ: “Echo: message ”).

Chạy server bằng trình thông dịch Python của bạn:

python server.py 

Trên một cửa sổ khác, gửi tin nhắn bằng ứng dụng client :

python client.py hello world! # Echo: hello world! 

Lưu ý: Để tắt server , bạn có thể sử dụng tổ hợp phím: Ctrl + C

Làm việc với Mô hình Xuất bản / Đăng ký


Trong trường hợp xuất bản / đăng ký, ZeroMQ được sử dụng để cài đặt một hoặc nhiều người đăng ký, kết nối với một hoặc nhiều nhà xuất bản và nhận liên tục những gì nhà xuất bản gửi (hoặc hạt giống ).

Lựa chọn để chỉ định một tiền tố để chỉ chấp nhận các thư bắt đầu bằng nó có sẵn với mẫu này.

Trường hợp sử dụng:

Mô hình xuất bản / đăng ký được sử dụng để phân phối đồng đều thông điệp cho nhiều người tiêu dùng khác nhau. Cập nhật tự động cho bảng điểm và tin tức có thể được coi là những lĩnh vực có thể sử dụng giải pháp này.

(Các) loại socket được sử dụng:

  • zmq.PUB
  • zmq.SUB

Ví dụ về nhà xuất bản: pub.py


Tạo một “pub.py” bằng nano ( nano pub.py ) và dán các nội dung bên dưới.

import zmq import time  # ZeroMQ Context context = zmq.Context()  # Define the socket using the "Context" sock = context.socket(zmq.PUB) sock.bind("tcp://127.0.0.1:5680")  id = 0  while True:     time.sleep(1)     id, now = id+1, time.ctime()      # Message [prefix][message]     message = "1-Update! >> #{id} >> {time}".format(id=id, time=now)     sock.send(message)      # Message [prefix][message]     message = "2-Update! >> #{id} >> {time}".format(id=id, time=now)      sock.send(message)      id += 1 

Khi bạn chỉnh sửa xong, hãy lưu và thoát bằng cách nhấn CTRL + X sau đó nhấn Y.

Ví dụ về người đăng ký: sub.py


Tạo một “sub.py” bằng nano ( nano sub.py ) và dán các nội dung bên dưới.

import zmq  # ZeroMQ Context context = zmq.Context()  # Define the socket using the "Context" sock = context.socket(zmq.SUB)  # Define subscription and messages with prefix to accept. sock.setsockopt(zmq.SUBSCRIBE, "1") sock.connect("tcp://127.0.0.1:5680")  while True:     message= sock.recv()     print message 

Khi bạn chỉnh sửa xong, hãy lưu và thoát bằng cách nhấn CTRL + X sau đó nhấn Y.

Lưu ý: Sử dụng thủ tục .setsockopt(..) , ta đăng ký để nhận thông báo bắt đầu bằng chuỗi 1 . Để nhận tất cả, hãy để nó không được đặt (tức là "" ).

Sử dụng


pub.py của ta được cài đặt để hoạt động như một nhà xuất bản , gửi hai thông báo khác nhau - đồng thời - dành cho những người đăng ký khác nhau.

Chạy nhà xuất bản để gửi tin nhắn:

python pub.py 

Trên một cửa sổ khác, xem bản in của nội dung đã đăng ký (tức là 1 ):

python sub.py! # 1-Update! >> 1 >> Wed Dec 25 17:23:56 2013 

Lưu ý: Để tắt các ứng dụng của nhà xuất bản và người đăng ký, bạn có thể sử dụng tổ hợp phím: Ctrl + C

Pipelining the Pub./Sub. với Mô hình đường ống (Đẩy / Kéo)


Tương tự như cách nó trông giống với mẫu Xuất bản / Đăng ký, mẫu Đường ống thứ ba trong dòng là một giải pháp cho một loại vấn đề khác: phân phối thông điệp theo yêu cầu.

Trường hợp sử dụng:

Pipelining pattern được dùng trong trường hợp danh sách các mục xếp hàng cần được định tuyến (tức là được đẩy vào hàng) cho người yêu cầu nó (tức là những người kéo ).

(Các) loại socket được sử dụng:

  • zmq.PUSH
  • zmq.PULL

Ví dụ về PUSH: manager.py


Tạo một “manager.py” bằng nano ( nano manager.py ) và dán các nội dung bên dưới.

import zmq import time  # ZeroMQ Context context = zmq.Context()  # Define the socket using the "Context" sock = context.socket(zmq.PUSH) sock.bind("tcp://127.0.0.1:5690")  id = 0  while True:     time.sleep(1)     id, now = id+1, time.ctime()      # Message [id] - [message]     message = "{id} - {time}".format(id=id, time=now)      sock.send(message)      print "Sent: {msg}".format(msg=message) 

File manager.py sẽ hoạt động như một trình phân bổ tác vụ .

PULL Ví dụ: worker_1.py


Tạo một “worker 1.py” bằng nano (`nano worker 1.py`) và dán các nội dung bên dưới.

nhập zmq

# ZeroMQ Context context = zmq.Context()  # Define the socket using the "Context" sock = context.socket(zmq.PULL) sock.connect("tcp://127.0.0.1:5690")  while True:     message = sock.recv()     print "Received: {msg}".format(msg=message) 

File worker_1.py sẽ hoạt động như một quy trình tác vụ (người tiêu dùng / công nhân).

Sử dụng


manager.py của ta được cài đặt để có role là người phân bổ nhiệm vụ (tức là người quản lý), PUSH nhập các mục. Tương tự như vậy, worker_1.py cài đặt để làm việc như một cá thể worker nhận các mục này, khi nó được xử lý xong bằng cách PULL vào danh sách.

Chạy nhà xuất bản để gửi tin nhắn:

python manager.py 

Trên một cửa sổ khác, xem bản in của nội dung đã đăng ký (tức là 1 ):

python worker_1.py! # 1-Update! >> 1 >> Wed Dec 25 17:23:56 2013 

Lưu ý: Để tắt các ứng dụng của nhà xuất bản và người đăng ký, bạn có thể sử dụng tổ hợp phím: Ctrl + C

Mẫu cặp độc quyền


Mẫu cặp độc quyền ngụ ý và cho phép cài đặt loại kênh giao tiếp một tông màu bằng cách sử dụng loại socket zmq/PAIR .

Ví dụ về ràng buộc: bind.py


Tạo một “bind.py” bằng nano ( nano bind.py ) và dán các nội dung bên dưới.

import zmq  # ZeroMQ Context context = zmq.Context()  # Define the socket using the "Context" socket = context.socket(zmq.PAIR) socket.bind("tcp://127.0.0.1:5696") 

Khi bạn chỉnh sửa xong, hãy lưu và thoát bằng cách nhấn CTRL + X sau đó nhấn Y.

Kết nối Ví dụ: connect.py


Tạo “connect.py” bằng nano ( nano connect.py ) và dán nội dung bên dưới.

import zmq  # ZeroMQ Context context = zmq.Context()  # Define the socket using the "Context" socket = context.socket(zmq.PAIR) socket.connect("tcp://127.0.0.1:5696") 

Khi bạn chỉnh sửa xong, hãy lưu và thoát bằng cách nhấn CTRL + X sau đó nhấn Y.

Sử dụng


Bạn có thể sử dụng ví dụ trên để tạo bất kỳ ứng dụng giao tiếp kết nối đơn hướng hai chiều nào.

Lưu ý: Để tắt một trong hai, bạn có thể sử dụng tổ hợp phím: Ctrl + C

<div class = “author”> Gửi bởi: <a
href = “https://twitter.com/ostezer”> Hệ điều hành Tezer </a> </div>


Tags:

Các tin liên quan