Producer-Consumer Pattern with RabbitMQ
📘 Backend/Java2024. 6. 25. 15:51Producer-Consumer Pattern with RabbitMQ

📚 Producer Consumer Pattern기존에 RabbitMQ의 Queue에서 대량의 데이터를 받아서 동시성을 처리할 때 사용하던 방법은,ReentrantLock의 tryLock을 이용해 명시적 Lock을 걸고 임계영역을 보호하는 방법을 사용 중 이었습니다.근데 문제는 평소 AI Engine에서 받은 MQTT 데이터의 흐름이 평상시에는 일정한 개수(1초에 200개 정도) 나오다가AI Engine에 특정 조건이 트리거 되어 특정 모드로 바뀔때 수 없이 많은 데이터가 쏟아져 나올 떄가 있으며, 그 메시지들을 그대로 Consume 해버리게 됩니다.Thread들을 충분히 나누었음에도 부하가 심해 Spring Server가 일시적으로 멈춤, 오작동하거나 API 호출이 안 먹는다거나 이슈들이 많았습니다...

Java에서 Windows Power Shell 명령어 실행
📘 Backend/Java2024. 4. 1. 10:45Java에서 Windows Power Shell 명령어 실행

Java에서 Windows PowerShell 명령어 실행 평소에 리눅스 환경의 서버에서 작업을 하다가 윈도우에 서버를 구축하고 Java 프로그램을 돌리던 중, 분석된 RTSP 영상을 HLS로 스트리밍 하는 로직에서 FFmpeg 프로세스가 실행이 안되어 알아 보았습니다. Java 코드에서 OS 마다 실행할 Command를 Runtime의 getRuntime().exec()를 통해 실행합니다. 이 때 Linux와 Windows는 Shell환경이 다르니 당연히 OS에 맞는 Shell을 지정해줘야 제대로 동작 할 겁니다. 잘 동작하는지 테스트 하기 위해 그리고 실시간 영상 변환 프로세스 체크 로직에 Windows 관련 코드를 좀 추가 해주었습니다. 그리고 리눅스와 같은 환경을 만들어 테스트 해보겠습니다. 테스..

Coarse-Grained Lock & Fine-Grained Lock
📘 Backend/Java2024. 3. 24. 00:56Coarse-Grained Lock & Fine-Grained Lock

Lock & Dead Lock 멀티스레딩 환경에서 Lock을 구현할 때 Fine-Grained Lock & Coarse-Grained Lock을 선택할 수 있습니다. 여러 스레드가 공유하는 Resource가 있을 때 모든 공유 리소스에 단일 Lock을 걸어 제한하거나, 각 리소스마다 개별적인 Lock을 걸어 제한할 수 있습니다. Coarse-Grained Lock Coarse-Grained Lock의 장점은 단일 Lock만 신경쓰면 되며, 공유 리소스에 액세스 할 떄 해당 Lock만 사용합니다. 아래 클래스에서 두 함수에 synchronized 키워드를 사용해 모든 객체에 단일 Lock을 생성 하도록 할 수 있습니다. 아래 두 함수에서 DB에서 Item을 가져오는 스레드와 그 작업을 Queue에 추가하려..

Java - Recursive를 이용한 File & Directory 제거
📘 Backend/Java2024. 3. 21. 14:29Java - Recursive를 이용한 File & Directory 제거

Java - File & Diretory 삭제 (Recursive) Scheduler를 이용하여 특정 시간에 오늘 날짜가 아닌 디렉터리와 디렉터리 내부의 파일들을 주기적으로 제거하는 로직을 만들던 중, 자바에서는 디렉터리 내부에 파일이 존재하면 디렉터리 삭제가 불가능한걸 알았습니다. 그래서 디렉터리 내부에 복잡한 트리구조의 디렉터리와 파일들이 있어도 손쉽게 제거할 수 있게 Recursive한 방법으로 구현 해 보았습니다. 구현 saveImageFile() 현재 날짜("MM-dd")형식의 디렉터리 생성 디렉터리 내부에 RabbitMQ RoutingKey + TimeStamp.png 형식의 이미지 파일 저장 private String saveImageFile(final String base64EncodedI..

ReentrantLock을 이용한 동시성 제어 (Mutex)
📘 Backend/Java2024. 2. 25. 05:32ReentrantLock을 이용한 동시성 제어 (Mutex)

📘 ReentrantLock을 이용한 동시성 제어 (Mutex) Spring Boot에서 동시성을 제어하는 방법은 여러가지가 있습니다. JPA에서 사용할 수 있는 DB 레벨의 Lock 메커니즘은 비관적 락(Pessimistic Lock), 낙관적 락(Optimistic Lock) 이 있고, Redis의 Lettuce (Spin Lock)방식, Redisson의 pub/sub 방식 등이 있습니다. 📘 동시성 제어에 Mutex를 활용하여 얻을수 있는 장점 저는 ReentLock을 이용한 Mutex를 구현하여 동시성을 제어하였습니다. 그 이유는 DB 레벨에서의 동시성 제어는 필요하지 않은 상황이고, 코드 레벨에서의 동시성 제어가 필요한 상황이며, 직접 Lock을 제어할 수 있어 더 세밀한 제어가 가능하기 떄문..

Java Serializable & Parsing
📘 Backend/Java2023. 10. 2. 00:08Java Serializable & Parsing

📘 Serialization vs JSON 비교 직렬화를 알아보게 된 계기는 CSV, JSON 같은 훌륭한 데이터 포맷이 있는데 왜 굳이 직렬화를 사용하는지 입니다. 직렬화란 자바 Object & Data를 다른 컴퓨터의 자바 시스템에서 사용 하도록 바이트 스트림(streams of byte) 형태로, 연속적인(Serial) 데이터로 변환하는 포맷 변환 기술입니다. 반대로 역직렬화는 바이트로 변환된 데이터를 원래대로 자바 시스템의 Object & Data로 변환하는 기술입니다. 이를 시스템적으로 보면 JVM의 Heap or Stack 메모리에 상주하는 객체를 직렬화해 DB나 외부 저장소에 저장하고, 다른 컴퓨터의 자바 시스템에서 이 파일을 역직렬화 하여 자바 객체르 변환 후 JVM 메모리에 적재시켜 사용..

Java Thread
📘 Backend/Java2023. 4. 2. 09:06Java Thread

📘 Thread 데이터와 어플리케이션이 확보한 자원을 활용하여 소스코드 실행 즉, 하나의 코드 실행 흐름 Thread 프로세스에서 실행 제어만 분리한 것 프로세스로부터 자원을 할당받고 그 자원을 이용하는 실행의 단위 프로세스의 Stack만 할당받고 코드 & 데이터 & 힙영역은 공유하기 떄문에 좀 더 효율적인 통신 가능 캐시 메모리를 비우지 않아도 되서 더 빠름 자원 공유로 인한 문제가 발생할 수 있으니 이를 염두에 둔 프로그래밍을 해야함 한 프로세스에 여러개의 스레드가 생성될 수 있음 즉, 캐시 메모리나 PCB에 저장해야하는 내용이 적고 비워야 하는 내용도 적기 때문에 상대적으로 더 빠른 컨텍스트 스위칭 📘 구현과 실행 Thread 클래스를 상속하는 방법 (다른 클래스 상속 불가, 권장 X) Thread..

image