Я хочу построить отказоустойчивую распределенную систему 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
Хорошая идея / плохая идея?