Быстрое отключение внешних служб или внедрение имитационных служб с помощью фабрики и 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")
Не уверен, что это лучший способ, имеет ли это смысл? Просто мне кажется, что это довольно много шаблонного кода.