Шаблон проектирования Python RPC — двунаправленное связывание — хорошая идея?

Я хочу построить отказоустойчивую распределенную систему barebone в соответствии со следующей спецификацией:

Учитывая настройку n компьютеры, если ith компьютер получает операцию обновления заданной пары ключ-значение, он должен выполнить обновление и распространить его на все другие узлы. Я бы хотел, чтобы связь между узлами осуществлялась с помощью RPC.

У меня есть следующий исполняемый код, который отлично работает:

import aiomas


class RpcCall:
    def __init__(self, port, method):
        self.port = port
        self.method = method

    async def __call__(self, *args, **kwargs):
        rpc_con = await aiomas.rpc.open_connection(("localhost", self.port))
        rep = await getattr(rpc_con.remote, "redirect")(*args, **kwargs, method_name=self.method)
        await rpc_con.close()
        return rep


class Node:
    def __init__(self, port, neb_ports):
        self.server = None
        self.port = port
        self.table = {}
        self.neb_ports = neb_ports

    def start(self):
        self.server = aiomas.run(aiomas.rpc.start_server(("localhost", self.port), Server(self)))

    def close(self):
        self.server.close()
        aiomas.run(self.server.wait_closed())

    async def update(self, key, value, replicate=True):
        self.table[key] = value
        if replicate:
            for neb in self.neb_ports:
                await self.replicate(neb, "update", key=key, value=value, replicate=False)

    async def replicate(self, node, method_name, *args, **kwargs):
        rpc_call = RpcCall(node, method_name)
        await rpc_call(*args, **kwargs)


class Server:
    router = aiomas.rpc.Service()

    def __init__(self, node: Node):
        self.node = node

    @aiomas.expose
    async def redirect(self, method_name, *args, **kwargs):
        func = getattr(self.node, method_name)
        await func(*args, **kwargs)


if __name__ == "__main__":
    n1 = Node(5555, [5556])
    n2 = Node(5556, [5555])
    n1.start()
    n2.start()

    aiomas.run(n1.update("foo", "bar"))

    print(n1.table)
    print(n2.table)

Я ищу обзор, посвященный шаблону проектирования, использованному выше.

Я соединил Node и Server классы так, чтобы всякий раз, когда Server получает вызов RPC, он делегирует его обратно Node, который затем выполняет операцию с базовым table

Хорошая идея / плохая идея?

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *