Доступность программных
систем
ДЗЮБА ДМИТРИЙ ВЛАДИМИРОВИЧ, СТАРШИЙ
ПРЕПОДАВАТЕЛЬ КАФ. 806
DDZUBA@YANDEX.RU
Проектирование архитектуры
2
Варианты использования системы
Требования по доступности
Требования по производительности
Требования по модифицируемости
Требования по безопасности
Требования по удобству тестирования
Требования по usability
Разделение системы на модули
Потоки данных между модулями
Интерфейсы между модулями
Требования к оборудованию
Размещение модулей на оборудовании
Требования к модулям
Проектирование
архитектуры
3
Доступность.
Доступность
Тактики
Обнаружение сбоя
Ping
Пульс
Исключения
Основная задача добиться гарантированного
время обнаружения недоступности модуля.
Дублирование модулей
Голосование
Активная избыточность
Пассивная избыточность
Stand-by
4
Тактики обнаружения
сбоя
Ping/echo
6
Пример на C++: Observer
class 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++: Object
class 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++: HeartbeatObserver
mutex _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++: Object
class 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++: Object
void 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++: Observer
void 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
Предотвращение сбоя
Прекращение обслуживания
Вывод из строя компонента до того как он может сбоить. Например,
перезагрузка для того что бы не было утечки памяти.
Транзакции
Процесс-монитор.
Процесс-монитор наблюдает рабочие процессы, и в случае обнаружения
сбоя перезапускает сбойные процессы.
Спасибо!

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

  • 1.
    Доступность программных систем ДЗЮБА ДМИТРИЙВЛАДИМИРОВИЧ, СТАРШИЙ ПРЕПОДАВАТЕЛЬ КАФ. 806 DDZUBA@YANDEX.RU
  • 2.
    Проектирование архитектуры 2 Варианты использованиясистемы Требования по доступности Требования по производительности Требования по модифицируемости Требования по безопасности Требования по удобству тестирования Требования по usability Разделение системы на модули Потоки данных между модулями Интерфейсы между модулями Требования к оборудованию Размещение модулей на оборудовании Требования к модулям Проектирование архитектуры
  • 3.
  • 4.
    Доступность Тактики Обнаружение сбоя Ping Пульс Исключения Основная задачадобиться гарантированного время обнаружения недоступности модуля. Дублирование модулей Голосование Активная избыточность Пассивная избыточность Stand-by 4
  • 5.
  • 6.
  • 7.
    Пример на C++:Observer class 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; } };
  • 8.
    Пример на C++:Object class 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.
  • 10.
    Пример на C++:HeartbeatObserver mutex _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; } };
  • 11.
    Пример на C++:Object class 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.
  • 13.
    Пример на C++:Object void 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)); }
  • 14.
    Пример на C++:Observer void 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; }
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
    Восстановление работы компонент послесбоя Теневые операции Некоторое время сервера работают параллельно, для проверки работоспособности. Синхронизация состояния Полностью восстанавливаются данные «упавшего сервера» на момент сбоя (если есть возможность). Откат к чекпоинам Восстанавливаются данные на определенный момент «чекпоинт», про который известно что данные были гарантированно целые. 19
  • 20.
    20 Предотвращение сбоя Прекращение обслуживания Выводиз строя компонента до того как он может сбоить. Например, перезагрузка для того что бы не было утечки памяти. Транзакции Процесс-монитор. Процесс-монитор наблюдает рабочие процессы, и в случае обнаружения сбоя перезапускает сбойные процессы.
  • 21.