(군대에서 겪었던 개발 이야기3) 동시성 구현중 Process 딜레이 발생
실행 환경: JAVA7, OS(WIndow)
군대에서 프로젝트 개발 중 동시성을 만드는 작업 중에서
하나의 스레드가 실행하는 Process Thread 는 어떤 방식으로 해야 성능을 챙길 수 있을까 고민하며
이때 저는 성능을 최대한 절약하기 위해서 스레드를 정지하면서 핸들링하는 것이 좋다는 생각에 기반하여, 동시성 로직을 개발하였습니다. (그게 독인줄도 모르고..)
간단히 동시성 로직을 설명 하겠습니다.
1. 스레드가 한 작업을 완수하면 대기 상태로 변경해라
2. 여러 스레드가 모두 대기 상태라면 모두 실행 상태로 변경해라
개발을하면서 PING 에서 받는 값이 딜레이가 생겨 이때는 어떻게 해결을 못 하고
어떻게든 최소 0.001초 꾸역꾸역 정지하면서 만들고 실제 훈련 때 3박 4일 운영을 했습니다.
훈련 과정에서 아슬아슬하게 운영을 하며 주기적으로 서버를 재부팅하여 딜레이를 최소화 했습니다.
자바로 구축된 서버라서 재부팅 속도는 약 3초에서 5초 정도라고 생각됩니다.
바쁜 상황에서도 전화를 받으며 임무를 수행하면서도 훈련을 마칠 수 있었습니다."
훈련 종료 후에는 근무 시간 외에도 개발업무를 수행하여 작업이 업무시간 외 작업으로 인정되어
상점을 받았습니다. 이로 인해 2시간당 1점씩 총 38점을 획득하였습니다.
저희 부대에서는 20점을 휴가 4박 5일로 치환할 수 있습니다. (총 개발 기간은 10일였습니다.)
이후 훈련이 끝난 후에도
딜레이가 발생했던 문제를 개선하려고 노력하였지만 끝내 해결은 하지 못했습니다.
하지만 전역 후 다시 리팩토링을 할 때 이 문제를 바로 잡았습니다.
나중에 리팩토링한 로직 아래와 같습니다.
1. 각 스레드는 출력 버퍼를 멈추지 않고 계속 가져와 eneity 에 저장합니다.
2. 스케줄러를 사용하여 5초마다 모든 스레드의 entity 의 값을 가져옵니다.