2

ZeroMQ と RabbitMQ の両方を使用できるメッセージング システムを開発しようとしています (activeMQ のようなものも可能です)。

そこで、次のように考えました。

メッセージング システムのコンポーネントは、送信者または受信者のいずれかになります。両方ともいくつかのアドレスを持っているので、一般化する必要があります。そこで、AbstractReceiver と AbstractSender という 2 つの洗練された抽象化を使用して、AbstractMessagingNode を作成しました。

class AbstractMessagingNode():
    __metaclass__ = ABCMeta

    def __init__(self, host):
        self.host = host

class AbstractReceiver(AbstractMessagingNode):
    __metaclass__ = ABCMeta
    callback = None
    host = None
    def __init__(self, host, on_receive_callback):
        super(AbstractReceiver, self).__init__(host)
        self.callback = on_receive_callback

    def on_message_received(self, *args):
        self.callback(*args)

class AbstractSender(AbstractMessagingNode):
    __metaclass__ = ABCMeta

    @abstractmethod
    def send_message(self, message):
        pass

そして、最初はrabbitmqだけで作業していました。そのため、さらに 2 つの洗練された抽象化を作成しました (基本的に、それらは具体的な実装と考えてください)。

class BaseRabbitSender(AbstractSender):
    __metaclass__ = ABCMeta
    default_port_number = 5672

    def __init__(self, host):
        super(BaseRabbitSender, self).__init__(host)
        self.connection = pika.BlockingConnection(pika.ConnectionParameters(
            host=host))
        self.channel = self.connection.channel()

    @abstractmethod
    def send_message(self, message):
        pass

    def close_connection(self):
        self.connection.close()

等...

zmq をそこに貼り付けようとするまで、これはすべてうまく機能していました。

問題は、zmqnode も送信者または受信者のいずれかになる可能性があることです (私の場合)。ただし、受信者と送信者の両方に共通のメソッドとフィールドが必要です。私はこのクラスでそれを捉えようとしました

class AbstractZmqNode(AbstractMessagingNode):
    __metaclass__ = ABCMeta

    def __init__(self, host, port):
        super(AbstractZmqNode, self).__init__(host)
        self.port = port
        self.context = zmq.Context()

   def set_hwm(self, hwm):
        self.socket.set_hwm(hwm)

    @staticmethod
    def build_address(host, port):
        strings = [host, ':', str(port)]
        return ''.join(strings)

しかし、その場合、AbstractZmqSender と AbstractZmqReceiver も必要であり、それは良くないため、コードの重複に問題が生じます。

ブリッジパターンについて考えていますが、どこから始めればよいかわかりません。ブリッジパターンのすべての例では、抽象化は単なるインターフェースですが、私の場合はいくつかのデータフィールドがあるためです。

私はあなたの助けと提案を受け入れています。

4

0 に答える 0