시스템을 완벽하게 설계한다고 하더라도 어느 곳에서는 항상 문제가 있긴 마련이다. 인간이 하는 일에는 모든 완벽한 것은 없다.
완벽함이란 신에게서나 있을법한 단어라고 보는게 맞을것이다. 인간은 언제나 실수를 하고 그 실수에서 새로운 것을 찾아낸다. 어쩌면 watchdog이란 완벽한 SW에서는 절대 필요하지 않는 도구이니 실수의 산물이라고 할 수 있다.
watchdog은 시스템을 감시하는 도구이며, 시스템이 중지되거나 해서 적절한 시간에 보고를 하지 않으면 시스템을 재시작 시키거나 종료시키게 만든다.
대표적으로 윈도우의 '응답없음' 메세지가 뜨는 경우나 안드로이드 단말에서 '응답없음' (ANR) 이 뜨는 기능이다.
만약 당신이 만드는 SW가 극한 상황에서도 동작해야 한다면 watchdog을 구현하는것을 추천한다.
watchdog sample
# dog server import control import threading import traceback import time dog_timer_dict = {"db":1000,"trader":1000,"predict":1000} dog_timer_init = {"db":5,"trader":5,"predict":10} def thread(logger): while(True): if logger : logger.info("start dog server") # Main Loop while(True): try: if control.dogkick_queue.empty(): time.sleep(60) for dog in dog_timer_dict: if dog_timer_dict[dog] > 0 : dog_timer_dict[dog] = dog_timer_dict[dog] - 1 for dog in dog_timer_dict: if dog_timer_dict[dog] == 0 : msg = dog + " server is down" logger.error(msg) control.havetosendmsg_queue.put_nowait({"cmd":"sendmsg","msg":msg}) time.sleep(60*60) continue else: data = control.qget(control.dogkick_queue) if data.get("server_name")!=None: dog_timer_dict[data.get("server_name")] = dog_timer_init[data.get("server_name")] except: traceback.print_exc()
dogkick 주기적으로 dog kick을 하도록 한다. queue 형태
control.dogkick_queue.put_nowait({"server_name":"db"})
control.py
# control.py import threading import queue dogkick_queue = queue.Queue() def qget(_queue): try: return _queue.get_nowait() except: return None