전체 글 (52) 썸네일형 리스트형 스프링에서의 ML 서빙 이 글은 스프링캠프2025에서 사이오닉AI의 김수원님의 발표를 바탕으로 정리하여 작성한 글 입니다. 해당 과정에서 제 실수로 잘못된 정보를 기재 하였을 수도 있는 점 양해 부탁 드립니다.배경: ML 서빙의 어려움파이썬 ML 서빙의 문제점성능 이슈: GIL(Global Interpreter Lock)로 인한 멀티스레딩 제약대규모 서비스 난이도: 메모리 관리 및 확장성 문제운영 복잡성: 패키지 의존성 관리 및 배포 복잡도클라우드 엔진 서빙의 어려움네이티브 언어 사용 필요: C++, Rust 등 저수준 언어 요구복잡한 파라미터 설정: GPU 메모리, 배치 크기 등 세밀한 튜닝 필요구축 및 운영 비용: 인프라 설정 및 유지보수 부담JVM 기반 ML 서빙 솔루션저수준 라이브러리ONNX Runtime: 크로스 플랫.. Virtual Thread와 소켓 IO 구현 정리 이 글은 스프링캠프 2025에서 박성훈 정승주님의 발표를 바탕으로 정리하여 작성한 글 입니다. 해당 과정에서 제 실수로 잘못된 정보를 기재 하였을 수도 있는 점 양해 부탁 드립니다. JDK 13 이전 vs 이후 소켓 구현 변화JDK 13 이전 (레거시 구현)PlainSocketImpl: JDK 1.0부터의 레거시 Java와 C 코드 혼합네이티브 함수 위주의 소켓 구현OS Socket 자원을 FileDescriptor에 위임synchronized 메서드 사용으로 Virtual Thread 비호환JDK 13 이후 (새로운 구현)NioSocketImpl: PlainSocketImpl의 드롭인 대체NIO 구현과 같은 JDK 내부 인프라 공유java.util.concurrent 락 사용으로 Virtual Thre.. resilience4j feign circuit 설정 이슈 기존에 feign을 resilience4j와 사용하면서 생긴 이슈 1. 클라이언트 인터페이스와 연결된 실제 서버에서 응답의 이슈가 있었음(DecodeException)2. 해당 오류는 에러디코드에서 제대로 해석되지 않았기에,서킷에서 무시하지 않고 집계됨3. 해당 영향으로 연결된 서비스가 정상적인 상태임에도 불구하고, 서킷이 오픈됨4. 결과적으로 연결된 전체 서비스의 요청에 폴백으로 넘어감@Beanfun feignDecorator( circuitBreakerRegistry: CircuitBreakerRegistry,): FeignDecorator { val circuitBreakerConfig = CircuitBreakerConfig.from(circuitBreakerRegistry.defaul.. Java, Call By Value? Call By Reference? Call By Something 배경서비스에서 약 백오십만의 유저에게 알림을 전달하는 새로운 시스템에 대해 이야기를 하다, 어떤 방식으로 이걸 풀어야 하는지 생각하게 됨API로 받아줄 경우 대상을 매번 추리는데 리소스가 크게 들거라 생각동시성 모델로 해당 대상 목록을 주기적으로 관리하며 알림을 전달하는건 어떨까 고민하게됨 잘못된 문제 인식 및 커뮤니케이션 오류동시성 모델로 선형적 자료형을 관리하고, 호출시마다 해당 자료형을 청크로 찍어내어 알림을 전달한다.예상된 문제는 값복사가 일어나서 메모리 사용량이 늘어날 거라 생각됨.대상을 추리기 위해서는 값복사 후 청크를 해야하나 vs 값복사 없이 청크를 말까안해도 된다고 해도 자바는 함수호출시 매개변수 전달로 인해 값복사가 일어나는데, 이건 문제가 아닐까? 체크.. 잡담 “언제나 그렇듯이, 코드 정리에 대한 커밋과 동작 변경에 대한 커밋은 분리해야 합니다.“ … Github Actions OIDC 이용한 AWS ECR 이미지 업로드 문제Actions에서 도커 이미지를 빌드하여 AWS의 ECR에 업로드 하기위해 하던 작업에는기존에 AWS의 Access key와 secret을 github secrets에 저장해두고 사용하던 방식이 있지요.해당 액션은 아래처럼 github secret에 IAM에서 생성한 유저의 액세스키를 등록하여 사용하였지요.... steps: - name: Checkout uses: actions/checkout@v3 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v2 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} .. [기록] Spring mockMvc test securityRequirements type @WebMvcTest를 진행시 Header에 Authorization을 할당 할 경우 아래 처럼 SecurityRequirements는 다양한 형태로 생길 수 있다. 근데 똑같이 헤더 이름을 지정하고, 테스트용 토큰 문자열을 할당하는데, 어떻게 아래처럼 다양한 결과를 맞을 수 있을까? 일단 스웨거 UI에서 우측 상단 아래에 있는 버튼을 활성화하려면 JWT_BEARER이어야 한다. 그 외 OAUTH2 관련 스펙을 정의하는건 별도 설정을 통해서 가능한데, 우선 나는 활성화를 하고 싶은데 안되어서, securityRequirements의 type을 결정하는건 대체 누가 해주나 싶어서 찾아 보았다. 결과는 아래와 같다. 토큰의 페이로드에 오는 데이터의 형태에 따라 결정된다고 보면 된다. scope가 포함된 토큰.. Virtual Thread & Hikari & Semaphore 가상스레드에서 DB 커넥션풀 사용시의 문제점스프링에서 가장 많이 사용되는 Hikari를 사용해서 테스트 해보자 테스트 결과는 아래와 같다. 처참하다.문제의 원인기존에 톰캣의 HTTP 커넥터 풀은 최대 스레드 수가 제한되어 있어 DB커넥션 사용에 있어서 적절한 웨이팅 시간 유지가 가능했다. 하지만, 가상스레드를 사용함으로 인해, HTTP 요청을 어마어마하게 받다보니, DB커넥션을 풀에서 받으려 기다리다 기다리다.. 결국 지쳐서 위와 같은 결과를 발생시킨다. 문제의 해결결과적으로 백프레셔가 필요한데, 이걸 자바에서 동시성에 제공되는 세마포어를 사용하여 해결해 보자. private lateinit var semaphore: Semaphore private var maxPoolSize: Int = DEFAULT.. 이전 1 2 3 4 ··· 7 다음