기타/기록

(군대에서 겪었던 개발 이야기3) 동시성 구현중 Process 딜레이 발생

oiNeh 2023. 2. 12. 22:05

실행 환경: 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 의 값을 가져옵니다.