회사에 Docker Swarm을 사용하여 현재 하나 씩 Docker rising 하며 옮기고 있습니다. 도입하고 나니 뿌듯함도 있었습니다. 뭔가 많이 개선된 점들이 보였기 때문인데요. 하나 씩 차근차근 살펴봅시다. CI와 CD의 완전 자동화 기존에는 하나의 서버를 병합 후 배포하는 동안 트래픽이 빠져나가는 걸 확인하고 이 후 배포 한 후 다시 트래픽이 들어오고 나서 개발자가 수동으로 다음 서버를 배포하는 방식이었습니다. 하지만 docker compose로 세밀한 배포 프로세스 조정이 가능하다보니 이를 docker swarm에 맡기고 배포 할 때 알아서 트래픽이 들어가야만 다음 컨테이너가 교체되어 개발자 입장에선 자동화 된 시스템에 맡길 수 있게 됐습니다. 이 동안 다른 시스템 배포를 하여 배포 시간을 줄..
이번엔 Docker swarm을 운영하면서 다양한 편리한 Tool 또는 기능을 소개해보겠습니다. 소개할 기술은 총 3가지입니다. 정적 Resource 파일을 관리하기 위한 Docker swarm config Docker 운영 GUI툴인 Portainer apm monitoring 위한 scouter 연동 Docker Swarm Config Docker swarm config는 Kubernetes의 configmap과 비슷한 기능을 제공합니다. 정적인 파일들을 관리하고 서비스 단위로 공유가 가능합니다. 또한 볼륨을 주입해줄 수 있어 클러스터간 파일을 공유할 수 있습니다. 하지만 k8s의 RBAC(Role-Based-Access-Control)이나 etcd를 이용한 전체 데이터 암호화 등의 기능은 제공하지 ..
운영 중인 서비스는 대부분 서비스 포트를 외부로 노출 시키지 않습니다. reverse proxy를 서버에 두고 80포트를 뚫어 요청을 받는경우가 많습니다. 이렇게 했을 때 다음과 같은 장점이 있기 때문인데요. 처리율 제한 알고리즘을 구현하여 서버 부하에 대비할 수 있습니다. 직접적으로 외부에 port 정보를 노출하지 않음으로써 DDoS 공격으로 부터 안전할 수 있습니다. Flow chart로 보면 다음과 같은 구조를 띕니다. 클러스터 환경에서 Nginx의 문제점 보통 reverse proxy로 Nginx를 많이 사용하고 있습니다. 하지만 Docker Swarm 환경에서는 클러스터로 운영되고 있기 때문에 reverse proxy가 도메인이나 서버를 라우팅 하기 위해 여러 domain 정보를 알고 있어야 했..
요즘은 서버를 분산시켜 관리하는 경우가 많습니다. 심지어 MSA로 전환되는 경우에는 각각 서버를 따로 운영하는건 너무 많은 비용을 야기하는데요 이럴 때 효과적인 방법으로 관리하기 위해 나온 클러스터라는 개념이 있습니다. 회사에서 부하 분산 서버를 클러스터로 전환하면서 배운 것들을 공유드리겠습니다. 사전에 이 글을 읽어보시는걸 추천드립니다. https://golf-dev.tistory.com/56 [Docker 4주차] Docker Swarm 도커 스웜을 사용하는 이유 보통 현업에서는 지금까지 한 것 처럼 호스트 하나로만 이루어져 있지 않습니다. 이유는 간단합니다. CPU나 메모리, 디스크 용량같이 자원이 부족한 경우에 스케일 아 golf-dev.tistory.com 부하 분산서버 부하 분산 서버는 하나의..
https://golf-dev.tistory.com/53 Redis INCR을 이용한 분산환경에서의 동시성 제어하기 문제 상황 회사에서 분산환경에서 하루에 한 번만 요청이 가능한 기능이었지만 한 사람이 3번 이상 요청을 보낸 기록이 있어 원인을 찾아보았습니다. 우선 샘플 코드는 다음과 같습니다. fun save( golf-dev.tistory.com 위 글을 보면 Redis의 INCR (increment)은 분산환경에서도 연산의 원자성을 지켜주기 때문에 이 성질을 이용하여 분산환경에서 동시요청에 대한 count를 한 후 일정 count 이상의 요청이 들어오면 해당 요청을 discard 시킬 수 있었습니다. 그렇다면 별 다른 로직 없이 분산환경에서 Redis로 동시성을 제어할 수 있었던 이유는 무엇일까요?..
배경. 배치를 만들던 도중에 Bean으로 등록해놓은 Thread Pool에 Thread가 꽉차서 Queue에 더 이상 Job이 들어갈 수 없다는 예외가 발생했습니다. 예를 들기 위해 테스트 코드를 하나 작성해보겠습니다. class ThreadPoolExecutorTest { @Test fun testThreadPoolQueueCapacity() { val executor = ThreadPoolExecutor( 2, // core pool size 2, // max pool size 0L, // keep alive time TimeUnit.MILLISECONDS, // time unit for keep alive time LinkedBlockingQueue(1) // queue with capacity 1..
대표적으로 필자가 사용하는 언어인 Java와 Kotlin은 compile 방식으로 해석되고 있습니다. 그리고 compiler로 해석된 자바 바이트 코드는 JVM의 interpreter로 기계어로 번역되어 실행되고 있습니다. 그리고 OS 코드영역에 올라가 OS에서 기계어를 읽어 적절한 동작을 합니다. 그렇다면 Java나 Kotlin은 컴파일 방식을 택했고 JVM은 왜 interpreter 방식을 택했을까요? 이 둘의 차이점은 무엇일까요? ⚙️ Compiler compiler는 소스코드를 기계어로 해석합니다. 과정은 다음과 같습니다. 소스 코드 읽기 : 컴파일러는 소스 코드 파일을 읽어들입니다. 어휘 분석 : 소스 코드를 토큰이라는 작은 요소로 분해합니다. 이 단계에서 컴파일러는 주석, 공백, 탭 문자 등을..
흔히 대용량 트래픽이 몰리는 서비스의 회사 스택을 보면 webFlux란걸 볼 수 있습니다. 그리고 실제 여러 글들에서 볼 수 있는 퍼포먼스 비교 분석 그래프를 보면 그 차이는 눈에띄게 차이가 납니다. 그렇다면 webFlux란 뭘까요? webFlux는 reactive programming을 지원하는 프레임워크로 비동기를 사용해 대용량 처리를 적은 자원으로 매우 빠르게 동시 처리하는 성능을 보여줍니다. 그렇다면 무조건 좋은 걸까요? 답을 말씀드리자면 그렇진 않습니다. 그렇다면 비동기가 좋은 경우는 어떤 경우일까? 먼저 어떤 경우에 좋은지 알기 위핸 사전 개념인 비동기와 동기 블로킹 논블로킹에 대해 알고 있을 필요가 있습니다. https://golf-dev.tistory.com/24 자바는 Synchroni..
스프링 MVC 구조는 tomcat 엔진에 thread pool을 사용하고 webflux 구조는 netty 엔진의 이벤트 루프를 통해 스레드를 미리 만들어놓은 환경에서 작업을 처리합니다. 이렇게 미리 만들어놓고 쓰는 이유는 스레드를 생성될 때마다 비용이 비싸기 때문에 미리 만들어 놔야 한다고 알고 있을겁니다. 이번 포스팅에서는 그 이유에 대해 알아보도록 하겠습니다. One-To-One multi-threading model 먼저 JVM에서의 다중 Thread 모델은 one to one 모델을 따르고 있습니다. 그렇다면 이 모델은 도데체 무엇이고 thread pool 등장 배경과 무슨 관계 일까요? one to one 모델은 사용자 수준의 thread와 커널 스레드가 1대 1로 연결되어있는 형태를 말합니다...
Java에서 Thread-safe 한 Map 자료구조를 생각하면 떠오르는 3가지에 대해서 알아보겠습니다. HashTable HashTable은 HashMap 이전에 사용하던 자료구조입니다. HashTable은 Thread-safe하게 동작하기 위해 내부가 다음과 같이 구현되어있습니다. put 메서드 구현부입니다. 메소드에 synchronized가 붙어있어 스레드가 HashTable에 put을 할 때에는 다른 스레드가 접근하지 못해 Thread-safe하게 동작합니다. 또한 다른 메서드들도 synchronized가 붙어 Thread-safe합니다. 하지만 이러한 구조는 문제점을 안고 있습니다. 메서드에 synchronized가 걸려있으면 class 전체에 Lock이 걸리기 때문에 HashTable의 기능 ..
- Total
- Today
- Yesterday
- DB
- docker
- 개발
- thread
- JPA
- Spring
- CS
- swarm
- 백엔드
- 게시판
- 면접 준비
- 코드
- MySQL
- 자바
- Redis
- IT
- java
- DevOps
- 면접준비
- 취준
- 동시성
- 면접
- Kotlin
- 개발자
- 프로그래밍
- 취업준비
- 인터뷰
- 코딩
- 프로젝트
- 취업
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |