21
Доступность программных систем ДЗЮБА ДМИТРИЙ ВЛАДИМИРОВИЧ, СТАРШИЙ ПРЕПОДАВАТЕЛЬ КАФ. 806 [email protected]

Архитектура. Доступноять программных систем

Embed Size (px)

Citation preview

Доступность программных системДЗЮБА ДМИТРИЙ ВЛАДИМИРОВИЧ, СТАРШИЙ ПРЕПОДАВАТЕЛЬ КАФ. 806

[email protected]

Проектирование архитектуры

2

Варианты использования системы

Требования по доступности

Требования по производительности

Требования по модифицируемости

Требования по безопасности

Требования по удобству тестирования

Требования по usability

Разделение системы на модули

Потоки данных между модулями

Интерфейсы между модулями

Требования к оборудованию

Размещение модулей на оборудовании

Требования к модулям

Проектирование

архитектуры

3

Доступность.

ДоступностьТактики

Обнаружение сбояPing

Пульс

Исключения

Основная задача добиться гарантированного время обнаружения недоступности модуля.

Дублирование модулей Голосование

Активная избыточность

Пассивная избыточность

Stand-by

4

Тактики обнаружения сбоя

Ping/echo

6

Пример на C++: Observerclass Observer

{

private:

mutex _mutex;

public:

void watch(Object *obj) {

bool all_fine = true;

while(all_fine){

cout << "Ping!" << endl;

_mutex.lock();

thread thr(*obj,&_mutex); thr.detach();

this_thread::sleep_for(chrono::seconds(3));

if(_mutex.try_lock()) _mutex.unlock();

else { cout << "Connection lost!!!!" << endl; return; }

};

cout << "End" << endl;

}

};

Пример на C++: Objectclass Object {

public:

void operator()(mutex *m) {

mt19937 generator((unsigned int)std::chrono::system_clock::now().time_since_epoch().count());

long sleep = generator() % 5;

cout << "Sleep:" << sleep << endl;

this_thread::sleep_for(chrono::seconds(sleep));

m->unlock();

cout << "Echo!" << endl;

}

};

int main(int argc, char *argv[])

{

Object obj;

Observer observer;

observer.watch(&obj);

return 0;

}

Пульс

9

Пример на C++: HeartbeatObservermutex _mutex;

class HeartbeatObserver {

private:

long _waiting = 0;

public:

void heartbeat() {

lock_guard<mutex> guard(_mutex);

_waiting=0; cout << "Heartbeat" << endl;

}

void operator()() {

long i=0;

while(i<5) {

this_thread::sleep_for(chrono::seconds(1));

_mutex.lock();

_waiting++;

i = _waiting;

_mutex.unlock();

}

cout << "He is dead!" << endl;

}

};

Пример на C++: Objectclass Object {

public:

void work(HeartbeatObserver *observer) {

while(true) {

mt19937 generator((unsigned int)std::chrono::system_clock::now().time_since_epoch().count());

long sleep = generator() % 10;

cout << "Working for:" << sleep << endl;

this_thread::sleep_for(chrono::seconds(sleep));

observer->heartbeat();

}

}

};

int main(int argc, char *argv[]) {

HeartbeatObserver observer;

Object obj;

thread thr(observer);

obj.work(&observer);

thr.join();

return 0;

}

Исключения

12

Пример на C++: Objectvoid Object::do_something()

{

mt19937 generator((unsigned int)std::chrono::system_clock::now().time_since_epoch().count());

long a = generator() % 10;

cout << "Now:" << a << endl;

if(a==5) throw new exception();

this_thread::sleep_for(chrono::seconds(1));

}

Пример на C++: Observervoid Observer::work(Object *obj){

try{

while(true) obj->do_something();

}catch(...) {}

}

int main(int argc, char *argv[]){

Object obj;

Observer observer;

observer.work(&obj);

return 0;

}

Тактики дублирования систем

Дублирование: Голосование

16

Дублирование: Активная избыточность

17

Дублирование: Пассивная избыточность

18

Восстановление работы компонент после сбояТеневые операции

Некоторое время сервера работают параллельно, для проверки работоспособности.

Синхронизация состояния

Полностью восстанавливаются данные «упавшего сервера» на момент сбоя (если есть возможность).

Откат к чекпоинам

Восстанавливаются данные на определенный момент «чекпоинт», про который известно что данные были гарантированно целые.

19

20

Предотвращение сбояПрекращение обслуживания

Вывод из строя компонента до того как он может сбоить. Например, перезагрузка для того что бы не было утечки памяти.

Транзакции

Процесс-монитор.

Процесс-монитор наблюдает рабочие процессы, и в случае обнаружения сбоя перезапускает сбойные процессы.

Спасибо!