Доброе время суток, в ВУЗе дали задание сделать отказоустойчивую систему. Я предпочел написать ее на питоне.
Но так как язык для меня новый, второй день на нем пишу возникают вопросы:
Как создать приложение-сервер, которое будет работать одновременно с двумя или более клиентами, плюс альтернативный (для отказоустойчивости) второй сервер.
Т.е. примерно так:
Альтернативный <----------> Основной
сервер сервер
/ | \
Клиент Клиент Клиент
Что-то читал про twisted, что-то про select, но в конце концов так и не понял как и что.
Вот мой быдлокод сервера:
# -*- coding: cp1251 -*-
import socket, string, threading, sys
def sync(sock):
sock.send('sync ok!')
def alt(num):
print """
====================
AltServer thread ok
====================
"""
def listen(port, first = False, num = 0):
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.bind(("localhost", port))
while 1:
print "Listen...", port
print "Thread: ", threading.currentThread(), " Num: ", num, "\n"
srv.listen(1)
global sock
sock, addr = srv.accept()
while 1:
rec = sock.recv(1)
if not rec:
break
else:
if (first):
while 1:
num = sock.recv(16)
if not num:
break
else:
print "Number rcvd success! (", num ,")"
sock.send("ok")
proc2 = threading.Thread(target=listen, name="cli2", args=[30001, False, num])
proc3 = threading.Thread(target=listen, name="cli3", args=[30002, False, num])
proc4 = threading.Thread(target=alt, name="altserver", args=[num])
proc2.start()
proc3.start()
proc4.start()
else:
sock.send(num)
status = sock.recv(16)
while 1:
if not status:
break
else:
if (status == "ok"):
sync(sock)
else:
sync(sock)
print "error, pack:", status
break
print "From %s:%s:" % addr, rec
sock.close()
def main():
proc1 = threading.Thread(target=listen, name="cli1", args=[30000, True])
proc1.start()
main()
sys.exit(0)
Сама суть программы — расчет числа Фибоначчи.
Клиент, который подключается первым отправляет введенное пользователем число (номер по порядку числа Фибоначчи), затем сервер отправляет это число на остальные подключенные клиенты, затем каждый клиент считает последующую итерацию, и отправляет ее на сервер, сервер сравнивает результаты, и использует принцип голосования (если какой-то клиент отправил неожиданные данные, то его ответ считается неверным, это записывается в лог и клиент принудительно отключается). Стоит учесть отказ основного сервера, если это произошло, то клиенты должны автоматически подключится к альтерантивному серверу и продолжать вычисление.