현재 재직중인 회사에서 Meilisearch라는 오픈 소스를 사용하여 프로그램을 개발하고 서비스를 하고 있는데, 이번에 동기와 비동기의 차이로 인한 버그가 발견되어 이번 글을 작성하게 되었다.
package sync;
public class SyncSampleMain {
public static void main(String[] args) {
System.out.println("작업 1 시작");
performTask();
System.out.println("작업 1 종료");
}
private static void performTask() {
try {
Thread.sleep(3000); // 3초 대기 (블로킹)
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("작업 2 완료");
}
}
결과
작업 1 시작
(3초 슬립)
작업 2 완료
작업 1 종료
package async;
import java.util.concurrent.CompletableFuture;
public class AsyncSampleMain {
public static void main(String[] args) {
System.out.println("작업 1 시작");
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
performTask();
});
System.out.println("작업 1 종료");
// 비동기 작업이 완료되기를 대기
future.join();
}
private static void performTask() {
try {
Thread.sleep(3000); // 3초 대기
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("작업 2 완료");
}
}
결과
작업 1 시작
(3초 슬립)
작업 1 종료
작업 2 완료
TaskInfo라는 객체를 응답받는데 해당 객체의 항목중 status의 값으로 구분하여 작업의 완료 여부를 체크status를 최대 10초 체크하는데 최근 10초를 넘어서 응답받은 고객사가 있어 수정이 필요 public static void validMeiliTask(Client client, int taskUid) {
try {
long sleepTime = 10L;
long totalSleepTime = 0L;
long maxSleepTime = 10000L; // 10 seconds
Task task = client.getTask(taskUid);
while (!task.getStatus().equals("succeeded")) {
Thread.sleep(sleepTime);
task = client.getTask(taskUid);
totalSleepTime += sleepTime;
if (totalSleepTime >= maxSleepTime) {
log.warn("timeout. taskUid:{}, taskStatus: {}", task.getIndexUid(), task.getStatus());
break;
}
}
} catch (MeilisearchException e) {
log.warn("meiliSearch Error: {}", e.getMessage());
} catch (InterruptedException e) {
log.warn("meiliSearch Task Sleep Error: {}", e.getMessage());
}
}
이번 개발이 나에게있어 가장 큰 고비였다.... 기존에 이미 개발을 다 해둔 상태라 모든 프로세스가 다 비동기로만 돌아가도록 되어있었고 전혀 다른 역할을 하는 서비스 여러개가 하나의 서비스로 운영되고 있어서.... 파악하는데도 엄청 오랜 시간이 걸렸다ㅜㅜ 그래서 대략적인 파악 후, 팀장님께 서비스 분리 요청을 드리고 서비스를 분리하는 작업을 진행하고 있다.
분리하는 작업을 해오면서 대략적으로만 파악했던 기능들에 대해서도 자세하게 알게되었고 메인 기능중 내가 모르던 코드들에 대해서도 알게되어서 시간가는줄 모르고 하고는 있다!! 하지만, 양이 너무 많다보니 이걸 어느 세월에 다 끝낼지 모르겠다ㅜㅜ(그때까지 내가 이 회사에 있을까....??)
아직 끝나진 않았지만 이번 기회에 오픈 소스를 사용하는 방법과 연동을 위해서는 어떤식으로 접근하는지에 대해서도 배워서 이 기회를 놓치지 않고 꾸준하게 공부하면서 새로운 지식 또는 기술을 습득하는 과정이 되었으면 한다.