DEV Community

Bahman Shadmehr
Bahman Shadmehr

Posted on

Implementing multiple consumers

Title: Building Multiple RabbitMQ Consumers with Python

Introduction:

In distributed systems, message brokers like RabbitMQ play a vital role in facilitating communication between different components. RabbitMQ offers robust features for message queuing and routing, making it a popular choice for building scalable and reliable systems. In this blog post, we will explore how to build multiple RabbitMQ consumers using Python. We will focus on implementing two consumer classes, SMSConsumer and ALLConsumer, each responsible for consuming specific types of messages.

Code Implementation:

Let's examine the code and understand the implementation of the SMSConsumer and ALLConsumer classes. Both classes inherit from the RabbitMQConsumerBase class, which serves as the foundation for building message consumers. The SMSConsumer and ALLConsumer classes accept parameters such as queue_name, binding_key, host, port, username, and password to establish a connection with RabbitMQ. By overriding the process_message method in each class, we define the logic to handle received messages.

from consumers.base import RabbitMQConsumerBase
from config import Config

class SMSConsumer(RabbitMQConsumerBase):
    def __init__(self, queue_name, binding_key, host, port, username, password):
        super().__init__(queue_name, binding_key, host, port, username, password)

    def process_message(self, channel, method, properties, body):
        print("Received SMS message:", body.decode())


class ALLConsumer(RabbitMQConsumerBase):
    def __init__(self, queue_name, binding_key, host, port, username, password):
        super().__init__(queue_name, binding_key, host, port, username, password)

    def process_message(self, channel, method, properties, body):
        print("Received message:", body.decode())
Enter fullscreen mode Exit fullscreen mode

Testing the Consumers:

To test the consumers, we utilize the Config class, which allows us to configure the necessary connection details for RabbitMQ. In the main execution block, we create an instance of each consumer class with the appropriate connection details and invoke the consume method on each instance. This starts the consumption process for each consumer, enabling them to receive and process messages from RabbitMQ.

if __name__ == "__main__":
    config = Config(override=True)
    SMSConsumer(
        queue_name="sms",
        binding_key="notif.sms",
        host=config.RABBITMQ_HOST,
        port=config.RABBITMQ_PORT,
        username=config.RABBITMQ_USER,
        password=config.RABBITMQ_PASSWORD
    ).consume()
Enter fullscreen mode Exit fullscreen mode

Conclusion:

Building RabbitMQ consumers in Python provides a flexible and scalable solution for handling messages in distributed systems. By implementing specialized consumer classes like SMSConsumer and more generic consumers like ALLConsumer, we can efficiently process specific types of messages or handle a broader range of message types. This approach allows developers to adapt their systems to specific messaging requirements while leveraging the powerful features of RabbitMQ.

Top comments (0)