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 も必要であり、それは良くないため、コードの重複に問題が生じます。
ブリッジパターンについて考えていますが、どこから始めればよいかわかりません。ブリッジパターンのすべての例では、抽象化は単なるインターフェースですが、私の場合はいくつかのデータフィールドがあるためです。
私はあなたの助けと提案を受け入れています。