develop
-
Cloud Native Spring Log4j Loggingdevelop 2024. 3. 3. 13:18
Cloud Native에서 Bible처럼 이야기되는 12 Factor App은 훌륭한 가이드이긴 한데, 실제 서비스를 개발 할 때에 전부를 지키지는 않고 있습니다. 그 중에서 거의 지키는 경우를 못 본 것으로 Log를 File로 남기지 말고 Event Stream으로 간주해서 Console Output으로 보내라는 부분입니다. Spring으로 개발 할 때에 왜 저런 것을 지키지 않는지, 특히 Logging을 처리하는 Log4j에서는 어떻게 이야기하는지를 확인 해 보았습니다. ref: Log4j – Using Log4j in Cloud Enabled Applications (apache.org)
-
REST API design guidedevelop 2024. 2. 12. 14:30
REST API Design 가이드는 REST API Design Guidance - Code With Engineering Playbook 같은 훌륭한 Article이 있습니다만, REST 가이드를 잘 유지하는 게 힘든지 아니면 Graph API 등의 트렌드와 맞지 않는지 해당 가이드는 Deprecate 되었네요. 대신에 다음과 같은 Azure의 가이드들이 일부 대체합니다. 웹 API 디자인 모범 사례 - Azure Architecture Center | Microsoft Learn api-guidelines/azure/Guidelines.md at vNext · microsoft/api-guidelines · GitHub 실제로 개발자들의 API를 리뷰 해 보면 단지 CRUD를 위해서 POST/GET..
-
Micrometer Meter 관련 성능 이슈develop 2023. 10. 28. 22:56
Micrometer를 통한 metrics을 관리하고 있는데, Profiling 시 가장 많은 CPU를 소모하고 있어서 분석을 해 보았습니다. meterRegistry.find("testMetricName").timer(); 문제되는 코드인데, meterRegistry에서 단순 조회를 한다고 생각했는데 MeterRegistry.find()의 내부 구현은 다음과 같습니다. Class MicrometerRegistry { public Search find(String name) { return Search.in(this).name(name); } } class Search { public Timer timer() { return findOne(Timer.class); } private M findOne(Cla..
-
Kubernetes에서 node 내 thread 분리 이슈develop 2023. 8. 20. 16:01
AWS EKS를 이용해서 Kubernetes 환경에서 서비스를 하는데, 갑자기 새벽 3시에 계속 서비스의 FD (File Descriptor)가 9,000 개 이상 차면서 서비스가 정상적으로 동작하지 않았습니다. 문제가 발생할 때에 다음의 증상이 있었습니다. File Descriptor가 9,000개 이상 차면서 외부 응답에 제대로 대응하지 못했습니다. Kubernetes에서 Node is not ready 상태에 빠졌다가 돌아오는 것을 반복했습니다. Node가 문제인가 해서 보았는데, Node에서 메모리 할당이 급격히 늘었습니다. 직접적인 원인으로 Application 에서는 native thread 생성 실패가 발생하고, 이 이후에 Kubernetes의 pod가 비정상인데도 계속 Traffic을 받고..
-
Ref: Sync 10,000 Argo CD Applications in One Shotdevelop 2023. 6. 29. 23:30
최근에 spinnaker에서 argocd로 kubernetes ci cd 환경을 이전했는데 배포가 너무 오래걸리네요. https://itnext.io/sync-10-000-argo-cd-applications-in-one-shot-bfcda04abe5b Sync 10,000 Argo CD Applications in One Shot A quantitative study on Argo CD scalability itnext.io 에 배포 최적화 관련 좋은 내용이 있어서 도움이 되었습니다.
-
Spring Cloud Configdevelop 2023. 5. 1. 08:37
Spring 환경에서 여러 환경 별 설정을 관리하기 위해서 Spring Cloud Config 를 사용하면 여러 장점이 있습니다. 중앙화된 하나의 한경에서 설정을 한꺼번에 관리한다던가, Spring Boot Actuator의 refresh endpoint를 이용해서 서비스 배포 없이 Bean을 재설정 할 수 있습니다. 하지만 Spring Cloud Config도 Kubernetes의 환경에서 대체되는 기능이 되었고, Cloud Native에서는 더 좋은 방법이 존재합니다. Kubernetes Configuration Management Options (exoscale.com) Chapter 11. Integrating Spring Boot with Kubernetes Red Hat Fuse 7.10 | ..
-
openssl 1.0.2에서 untrusted chain 문제develop 2022. 11. 6. 22:16
최근에 서비스에서 사용하고 있는 intermediate certificate가 만료되어서 일부 client에게 장애가 발생했습니다. Load Balancer에서 Client SSL Negoation Error가 급증해서 문제를 확인 가능했습니다. 관련해서 왜 일부 client에서만 문제가 발생하나가 궁금했는데, openssl 1.0.2의 동작이 문제네요. EC2 인스턴스에서 만료된 Let's Encrypt 인증서 수정 에 다음과 같은 내용이 있습니다. OpenSSL 1.0.2에서는 신뢰할 수 없는 체인이 항상 우선시됩니다. 이는 만료된 인증서가 표시되고 전체 체인이 만료된 것으로 간주됨을 의미합니다. 최근 버전의 OpenSSL에서는 문제가 없는데, OpenSSL 1.0.2에서는 일부 신뢰할 수 없는 체인..
-
DynamoDB에서 Error Injectiondevelop 2022. 9. 1. 14:00
DynamoDB에서 Test를 수행 할 때에 Error를 주입해서 동작을 확인해야 할 때가 있습니다. 대표적으로 ThrottlingException 처럼 발생할 가능성이 높은 에러들은 미리 확인해야 하죠. 관련해서 2013년에 AWS Blog에 올라왔던 Injecting Failures and Latency using the AWS SDK for Java 의 방법이 다른 모듈에 의존성 없이 적용할 수 있습니다. 문제는 해당 Source가 2013년 기준으로, 여기서 사용했던 RequestHandler는 deprecate 되어서 RequestHandler2가 되었고, 더더욱 최신 AWS Java SDK v2에서는 해당 Class가 아예 없어져서 적용할 수 없네요. 찾아보니 ClientOverrideConf..