일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 머신러닝
- Redis
- 오픈시프트
- 로깅
- GPT
- 도커
- fastapi
- 컨설팅
- 컨설턴트
- 솔루션조사
- vue.js
- Machine Learning
- fast api
- LLaMa
- 메세지큐
- OpenShift
- POD
- SpringBoot
- 생성형
- k8s
- 생성형 AI
- Docker
- Python
- jpa
- kubernetes
- vuejs
- BFS
- LeetCode
- 리트코드
- 쿠버네티스
- Today
- Total
목록전체 글 (79)
수 많은 우문은 현답을 만든다
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cibWra/btrZ6jNbiMY/p1FPbdcznflIOYxVv1aJ91/img.png)
안녕하세요 조영호입니다. 오늘은 고객사와 제 회사간의 네트워크를 전용선으로 연결했던 경험에 대해 소개하고자 합니다. 구분 출발지 SNAT DNAT 도착지 고객사 10.10.10.123 (폐쇄망) 192.168.10.123 192.168.128.1 내회사 192.168.128.456 192.168.128.2 서비스 환경을 먼저 설명드리자면, 고객사는 내부망(폐쇄망)을 사용하고 있었고 내부망에 구축한 JAVA 서비스에서 제 회사로 API 요청을 보내야하는 상황이었습니다. 우선, 사설 IP를 사용하고있는 고객사에서는 NAT 변환을 통해 사설 IP 공인 IP의 연결 구간을 준비했고 제 회사는 외부망 용 로드밸런서를 통해 서비스를 제공하고자 했습니다. 위에서 사용한 개념들에 대한 설명입니다. 사설 IP : 인터넷..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cZ64vo/btsivSp6QHq/sCfk31kkZahLUpnHxcflBK/img.jpg)
안녕하세요 조영호입니다. 오늘은 성능테스트 당시 발견한 CPU 사용률이 100%까지 올라가는 현상을 해결한 경험을 공유하고자 합니다. 다른 웹 페이지들과는 다르게 빅데이터(약 80,000,000건)를 조회하는 페이지에서 TPS가 너무 낮게 나오는 현상이 있었습니다. 이슈 내용 Database 조회 Table에는 적절한 Index를 설정했다 조회 API에서 Index 검색을 탈 수 있도록 필요한 컬럼들을 파라미터로 보냈다 동시접속자 30명이 넘어가면 CPU가 100%를 치면서 서비스가 마비되는 현상이 발생했다. 테스트 내용 Jmeter로 동시 접속 사용자를 기준으로 웹 사이트의 부하테스트를 수행했습니다. 일반적으로 데이터가 많지 않은 Back-end API는 호출시 300 tps 이상의 빠른 응답을 보였지..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/dppUXi/btrUssBllqs/GqYkzxmz3bkUK3Wk1lPvg0/img.jpg)
안녕하세요, 조영호입니다. 프론트엔드 프로젝트에서 yarn build만 하면 js heap out of memory 오류가 발생하는 이슈가 있었습니다. 해당 이슈를 해결하는데 나름 고생을 많이해서 경험을 글로 공유하고자 합니다. 우선 보안과 빌드 속도 측면에서 yarn이 npm 보다 우수하다는 글들을 보고 yarn을 사용하고 있었습니다. 빌드를 하기위해 yarn build를 치면 아래와 같은 오류가 발생했습니다. node:internal/event_target:969 process.nextTick(()=> {throw err;}); Error [ERR_UNHANDLED_ERROR]: unhandled error. error Command failed with exit code 1. 원인 파악 과정 폐쇄망..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/mD3hi/btsitFyxV64/fed4Q0QW2ligEaBedWJYM1/img.png)
안녕하세요, 조영호입니다. Spring에서는 공통 설정이나 숨겨야하는 내용들을 properties 또는 yml 파일에 적어놓고 그 값들을 호출해서 애플리케이션에서 사용합니다. 오늘은 이 설정값들을 불러오는 두 방법에 대해서 알아보겠습니다. 1. @Value 어노테이션 @Value("${api.url}") private String url; 2. @ConfigurationProperties 어노테이션 @Component @ConfigurationProperties(prefix = "api") @Data public class urlManager{ private String url; } 3. @Value vs @ConfigurationProperties 비교 한 두가지의 간단한 설정을 가져올때는 @Value..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cEXeaG/btsivhp71Rs/d1gSLyIh2gAhPb84pQjRrk/img.jpg)
안녕하세요 조영호입니다. 오늘은 한글 인코딩으로 이틀간 고생했던 경험을 공유하고자 합니다. 혹시라도 누군가에게 도움이 되시길 바라면서.. 상황 설명 저는 VM 2개와 Rabbitmq 1개 사이에서 데이터를 주고받는 서비스를 개발하고 있었습니다. VM들에는 각각 A서비스, B서비스가 실행되고 있는 상태였습니다. 한글 인코딩 문제는, A서비스에서 "message" : "한글메세지" 형태로 메세지를 Rabbitmq로 보내서 B서비스에서 메세지를 Json Parsing 할때 예외가 발생했습니다. 예외 내용 예외의 내용은 대략 아래와 같았습니다. Json Parsing Exception : ':' is not expected value on "message" : "+#)!#*(":#(@". 메세지가 전달되는 과정..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/VZ7sz/btsitGK4cbz/Pc20hCMbHbJOzLFYMy3os0/img.png)
안녕하세요 조영호입니다. 오늘은 업무 중 세마포어와 관련된 질문을 받았고 바로 명쾌하게 대답하지 못했던 것이 아쉬워서 글로 남겨봅니다. 받은 질문과 대답 Q :"현 프로젝트에서 세마포어 구조를 쓰고있나요? 가령, 캐시 사용 같은 부분에서요" A : "프로세스 간에 함께 공유하는 자원이 없어 세마포어를 쓰고있지 않습니다" 자 우선 OS 이론에서 자주 등장하는 세마포어, 뮤텍스, 동기화의 차이에 대해서 알아보겠습니다. 세마포어(Semaphore) : 공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에 여러 Process 혹은 Thread가 접근하는 것을 막아줍니다(즉, 동기화 대상이 하나 이상) 뮤텍스(Mutex) : 공유된 자원의 데이터 혹은 임계영역(Critical Section) ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cm3D69/btrGEieXjdN/olQaEajxK4noKY7ZS3mFW0/img.png)
안녕하세요~ 조영호입니다. 오늘은 Rabbitmq의 고가용성을 보장하기 위해서 클러스터를 구성한 경험을 공유하겠습니다. Rabbitmq Cluster는 Active-StandBy 구성입니다. Active 큐의 내용을 StandBy가 복제받는 형태입니다. 클러스터는 아래 스펙의 3대 서버로 구성 해보겠습니다. OS : Ubuntu-18.04-KEP SPEC : vCPU: 4개, Memory: 16GB Volume : 50GB 1. Rabbitmq 설치 sudo apt-get install -y rabbitmq-server sudo rabbitmq-plugins enable rabbitmq_management (삭제는 apt purge -y rabbitmq-server 를 수행한다. remove는 설정파일이..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/ck0dNZ/btrEKUM6v3V/timcEvbT0Cq1iDeL45m650/img.png)
로드밸런서란? 로드밸런서는 트래픽을 받아서 여러 대의 서버에 분산시키는 하드웨어 또는 소프트웨어 입니다. L4부터 Port를 다룰 수 있기 때문에 부하 분산에 L4 Load Balancer와 L7 Load Balancer가 많이 사용됩니다. Load Balancer는 한 대 서버의 각각의 포트에 여러개의 서비스들을 운영할 수 있도록 합니다. L4 LB vs L7 LB L4 Load Balancer는 IP, Port 를 기준으로 스케줄링 알고리즘을 통해 부하를 분산합니다. 클라이언트에서 로드밸런서(DNS)로 요청을 보냈을 때 최적의 서버로 요청을 전송하고 결과를 클라이언트에게 줍니다. L7 Load Balancer는 L7 위에서 동작하기 때문에 IP, Port 이외에도 URI, Payload, Http H..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bwoUUj/btrEH5POWDF/MK0cQZxdicAGzr1kS6wz0K/img.png)
VIP란? VIP 는 가상 아이피를 의미하고 VIP의 목적은 이중화 환경에서의 로드밸런싱에 있습니다. VM이 2대가 있고 각각 IP가 할당되었다고 가정하겠습니다. 2대는 같은 서비스를 제공하고 있는데 누구에게 패킷을 전달해야 할까요? 이때, 가상IP를 들고 있는 VM 이 Master가 되고 다른 VM은 Slave가 되는 것 입니다. 방화벽 이중화 예시 그리고 Master장비로 부터 응답을 받지 못하면 Slave가 VIP를 소유하게 됩니다. VIP 종류? VIP의 종류는 2가지 (Public VIP, Private VIP) 가 있습니다. 공인 아이피(Public VIP) 를 사용하면 외부에서 내부 보안 존으로 접근하도록 할 수 있습니다. Private VIP는 말 그대로 내부에서만 사용되는 용도입니다. 만..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/kVrpt/btrEdRb93bE/DCWUkhwuREh82ZWevk2ZZ1/img.jpg)
우리는 보통 난수를 생성할때 Random() 을 사용합니다. 그러나 Random() 함수는 치명적인 문제가 있어서 운영 프로그램을 짤때는 SecureRandom()을 사용해야한다는 것을 알게되어 공유하고자 합니다. 스프링 부트를 이용해서 웹 애플리케이션을 만들 때 우리는 기본적으로 톰캣을 이용합니다. 그리고 톰캣이 리눅스 환경에서 난수를 생성할 수 있도록 다음 옵션을 줘야합니다. JAVA_OPTS='-Djava.security.egd=file:///dev/urandom 실제로 Random() 함수를 사용하면 소나큐브에서 아래와같은 Critical 버그가 발생합니다. Random 값이 필요할 때마다 새 개체를 만드는 것은 비효율적이며 JDK에 따라 임의의 숫자가 생성되지 않을 수 있습니다. 무심코 사용했던..