레이블이 watchdog인 게시물을 표시합니다. 모든 게시물 표시
레이블이 watchdog인 게시물을 표시합니다. 모든 게시물 표시

2021년 7월 24일 토요일

watchdog


시스템을 완벽하게 설계한다고 하더라도 어느 곳에서는 항상 문제가 있긴 마련이다. 인간이 하는 일에는 모든 완벽한 것은 없다.

완벽함이란 신에게서나 있을법한 단어라고 보는게 맞을것이다. 인간은 언제나 실수를 하고 그 실수에서 새로운 것을 찾아낸다. 어쩌면 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