diff --git a/docs/tech_docs/python/ZeroMQ.md b/docs/tech_docs/python/ZeroMQ.md new file mode 100644 index 0000000..739b96d --- /dev/null +++ b/docs/tech_docs/python/ZeroMQ.md @@ -0,0 +1,104 @@ +When focusing on seamless data exchange and communication between different applications or systems, especially in Linux environments where diverse applications often need to interoperate, `ZeroMQ` (also known as `ØMQ`, `0MQ`, or `zmq`) emerges as a highly powerful and useful library. ZeroMQ is a high-performance asynchronous messaging library, aimed at use in distributed or concurrent applications. It provides a message queue, but with a socket-style API. + +### ZeroMQ Reference Guide + +#### Installation +To start using ZeroMQ with Python, you need to install the Python binding for ZeroMQ, `pyzmq`: +```sh +pip install pyzmq +``` + +#### Basic Usage + +##### Establishing a Simple Publisher-Subscriber Connection +ZeroMQ can operate in various communication patterns. One of the simplest is the publisher-subscriber pattern, where one or more publishers send messages to one or more subscribers. + +###### Publisher +```python +import zmq + +context = zmq.Context() +socket = context.socket(zmq.PUB) +socket.bind("tcp://*:5555") + +while True: + # Wait for the next request from the client + message = "Hello World" + socket.send_string(message) + print(f"Sent: {message}") +``` + +###### Subscriber +```python +import zmq + +context = zmq.Context() + +# Create a new SUB socket and connect to the publisher +socket = context.socket(zmq.SUB) +socket.connect("tcp://localhost:5555") + +# Subscribe to all messages +socket.setsockopt_string(zmq.SUBSCRIBE, '') + +# Receive messages +while True: + message = socket.recv_string() + print(f"Received: {message}") +``` + +##### Request-Reply Pattern +Another common pattern is the request-reply pattern, where each query from a client is met with a response from the server. + +###### Server +```python +import zmq + +context = zmq.Context() +socket = context.socket(zmq.REP) +socket.bind("tcp://*:5556") + +while True: + # Wait for the next request from the client + message = socket.recv_string() + print(f"Received request: {message}") + + # Send reply back to client + socket.send_string("World") +``` + +###### Client +```python +import zmq + +context = zmq.Context() +socket = context.socket(zmq.REQ) +socket.connect("tcp://localhost:5556") + +# Send a request +socket.send_string("Hello") + +# Wait for the reply +message = socket.recv_string() +print(f"Received reply: {message}") +``` + +#### Advanced Features + +- **Multiple Communication Patterns**: Beyond PUB-SUB and REQ-REP, ZeroMQ supports patterns like PUSH-PULL for load balancing and DEALER-ROUTER for complex routing of messages. +- **High Scalability**: ZeroMQ can scale to numerous nodes with minimal effort, enabling high-throughput and low-latency messaging across distributed systems. +- **Language and Platform Agnostic**: ZeroMQ can be used across many programming languages and platforms, making it ideal for heterogeneous environments. + +#### Use Cases + +- **Microservices Architecture**: Facilitating communication between microservices, whether they are on the same machine or distributed across a network. +- **Real-Time Data Processing**: Streaming data between systems for real-time processing, such as financial tick data for trading systems or sensor data for IoT applications. +- **Task Distribution**: Distributing tasks among a pool of worker processes for parallel processing. + +#### Integration with Linux Systems +ZeroMQ is particularly well-suited for Linux systems involved in distributed computing and microservices, where various components may need to communicate efficiently and reliably. It complements Linux's robust networking and process management capabilities. + +#### Security Considerations +While ZeroMQ supports encrypted connections using CurveZMQ for secure messaging, it's crucial to properly configure security features, especially when communicating over untrusted networks. + +ZeroMQ offers a compelling approach to building complex, scalable, and efficient messaging solutions with Python on Linux, encapsulating powerful messaging patterns behind a simple API. This combination supports the development of highly responsive, distributed applications tailored to the specific demands of modern systems. \ No newline at end of file