Быстрое отключение внешних служб или внедрение имитационных служб с помощью фабрики и import_string - хороший шаблон?

Мне нужен был быстрый способ, позволяющий менять сервисы очередей и использовать любой из Kafka, RabbitMQ и т.д. или даже заменить на Mock-сервис очередей.

Поэтому я установил его, используя import_string.

Есть абстрактный базовый класс (ABC), фабрика очередей, реализации и значение в settings.py, которое говорит, какую очередь использовать.

class Producer(ABC):
    """Abstract producer."""

    @abstractmethod
    def send_message(self, queue_name, message):
        """Send a message to a queue."""
        pass

class KafkaProducer(Producer):
    """Kafka producer."""

    def send_message(self, queue_name, message):
        """Send a message to a Kafka queue."""
        send_message_to_kafka(message)

class QueueFactory:
    """Queue factory."""

    @staticmethod
    def get_producer():
        """Get configured queue producer."""
        return import_string(settings.QUEUE_PRODUCER_CLS)()

В settings.py:

QUEUE_PRODUCER_CLS = "queues.kafka.KafkaProducer" # set to Kafka queue
QUEUE_PRODUCER_CLS = "queues.tests.mock_queue.MockProducer" # set to Mock queue

Тогда вы можете вызвать его следующим образом:

QueueFactory.get_producer().send_message("my-queue", "my message")

Не уверен, что это лучший способ, имеет ли это смысл? Просто мне кажется, что это довольно много шаблонного кода.

Вернуться на верх