토이프로젝트 - Apache Kafka 성능 비교
·
kafka
​Apeche Kafka와 queryDSL 실습을 통해서 좀 더 손에 익도록 연습하기 위해 준비한 공부용 프로젝트 ​https://github.com/downfa11/kafka-concurrency GitHub - downfa11/kafka-concurrency: kafka 트랜잭션 관리와 Redisson 분산 락 처리kafka 트랜잭션 관리와 Redisson 분산 락 처리. Contribute to downfa11/kafka-concurrency development by creating an account on GitHub.github.com  순전히 Kafka 사용을 위해 준비한 프로젝트로 전혀 비즈니스용이 아님을 알린다docker-compose로 Zookeeper, Kafka, kafka-ui, ..
우당탕탕 C++로 Apache Kafka 통신하기 (rdkafka, modern-cpp-kafka)
·
kafka
librdkafka 라이브러리를 통해서 Windows 환경에서 C++로 Apache Kafka를 사용하고자 했다.백엔드로 구축한 로비 서버와 dedicated 서버간의 통신하기 위한 메세징 큐로 뛰어난 성능의 이벤트 브로커인 Kafka를 채택했었다.​IO Completion Port로 윈도우 환경에서 비동기, Non-Blocking IO 통신을 구축한 게임 서버와 통신해야할 로비 서버도 역시 블로킹 동작을 막기 위해서 Spring Webflux로 Netty 기반의 비동기 Non-Blocking IO를 구현했다.​서버간의 IPC 역시 블로킹 작업이 이뤄지면 오히려 일반적인 구조의 서버보다 느려지기 때문에 비동기로 이뤄져야한다!!순전히 흥미본위로 시작한 기술 프로젝트에 가깝지만, 너무 어려워도 재밌다.​​m..
HTTP multipart/form-data 파일 업로드 문제 해결
·
backend
토이프로젝트에서 쓰이는 기능중에 이미지와 파일을 업로드하는 경우가 종종 생겼는데,json 형태의 dto와 파일을 함께 받아야하는 상황에서 오류가 발생했었다.​HTTP에 대한 개념적인 부분이 부실해서인지, 막연히 이미지만 multipart로 보내면 된다고 생각했었다.​게시글 작성에 관한 정보를 담은 json은 그대로 @Requestbody로 보냈다가 415 Unsupported Media Type 오류를 직면했다.​ 클라이언트에서 서버로 파일을 업로드하는 과정1. 웹브라우저를 통해 파일을 등록하는데, HTTP header의 Content-Type 속성을 multipart/form-data로 지정Content-Type은 간단히 말해서 '보내는 자원의 형식'을 명시하는 헤더의 정보이다.​2. 이미지 파일을 B..
Hexagonal 아키텍처와 MVC 패턴 비교
·
backend
아키텍처의 설계는 유지 보수가 잘 되어야 기술적 부채를 줄여줄 수 있다. 이는 곧 프로젝트의 초기 단계에서부터 설계의 중요성을 깨닫고 훈련해야함을 의미한다. ​들어가기에 앞서서, 기존의 계층 구조와 MVC 패턴의 차이점부터 먼저 언급하고 가겠다. 주제와 연관은 없지만 함께 공부한 내용이라 넣어봤다.​​MVC와 계층 구조의 차이점MVC 패턴과 Layered Architecture가 그냥 비슷한 개념으로 생각해왔다. 그러다가 커뮤니티에서 차이점에 대해 이야기하는 글을 보게 되었고, 좀 더 깊게 찾아봤다.​MVC 패턴은 주로 비즈니스 로직과 화면(View)를 구분하는데 중점을 두고 Model, View, Controller 로 구성된다. 반면 3tier 계층 구조는 Presentation, Applicatio..
Spring Cloud를 뜯어보자 (Gateway, Config, Netflix Eureka)
·
backend
마이크로 서비스 아키텍처(MSA)는 하나의 모놀리식 아키텍처에서 각 도메인별로 분해하여 비즈니스에 따른 유연한 대응을 목적으로 한다.​구조는 복잡해져도, 기술만을 중요시하지 않고 도메인을 신경써야하는 요즘 시대에 걸맞는다고 볼 수 있어서 시장의 대세로 자리잡았다. ​그런 MSA의 단점으로 꼽히는 문제점들이 있고, 각 서비스들은 이 문제를 어떤 방식으로 해결하는가? 가 중요해졌다. ​ 예를 들자면​여러 마이크로 서비스들이 어디 있는지 어떻게 찾아야 하는가?각 서비스는 어떻게 통신하는가?보안적 요소나 속도 제한처럼 서비스의 접근을 어떻게 제어하는가?문제 상황 발생시, 개별 서비스가 응답하지 않으면 비즈니스를 어떻게 처리할건가?​​이런 복잡한 문제점들을 해결하기 위해 Spring Cloud에서 여러 서비스를 ..
Github Action으로 시작하는 GitOps 파이프라인(AWS ECR, Github Actions)
·
backend
Github Actions이 뭘까?CI/CD와 같은 workflow를 자동화 할 수 있는 도구로, 2018년부터 깃허브에서 제공하는 서비스.​깃허브를 통해서 버전 관리나 협업하는 이상, 깃허브 내의 이벤트(push,pull,merge ...) 의 발생에 대해 정해진 동작을 실행해주는 Actions 기능은 Jenkins같은 CI 툴만큼이나 편리할 수 밖에 없다. Public 레포지토리는 제한있는 무료로 사용 가능함.​Github CLI를 사용하면 Repository를 push하지 않더라도 Branch의 Actions들을 실행하고 필요한 정보를 넘겨줄 수 있다.​​​들어가기에 앞서서, 알아둬야할 핵심적인 개념을 소개하겠음 Github Actions의 구성1. WorkflowEvent를 트리거로 여러 Job으..
구글 현직자분께 물어본 Kubernetes와 보그(Vogue) 비교
·
kubernetes
구글 사옥에 놀러갈 기회가 되어서 구글 클라우드 내부 인공지능과 보안 분야에 대한 강연을 들었다.구글 코리아 내에 두 분 계시는 클라우드 보안쪽 연구원분께서 안내를 해주셨고, 용기내서 궁금한 점을 물어봤다. ​ 구글에서 쿠버네티스를 설계한 걸로 아는데, 사내에서 쓰는 자체 기술과 어떤 차이점이 있나요?​ 구글은 쿠버네티스를 사용하지 않는다고 들은 기억이 있었는데 이유가 궁금했다. 구글 내에서 운영하고 있는 서비스들을 유연하게 관리하기 위해서 사내 컨테이너 오케스트레이션 보그(Vogue)를 개발해 운영하고 있었다. ​써보니까 너무 편리하고 괜찮았고, 이를 범용성 있게 다시 만들어서 오픈소스로 공개한게 쿠버네티스(kubernetes)이다.클라우드 리소스는 보통 하드웨어에 종속되는 편이라 범용 오픈소스로 출시..
ArgoCD를 이용한 무중단 배포하기(Canary 방식, argo-rollout)
·
kubernetes
운영환경에 어떻게 배포하는지 Continuous Delivery/Deployment에 대해 알아보자.​Deployment는 그냥 바로 배포 때려버리는거고, delivery는 그냥 deploy전에 명시적 승인 절차를 마지막에 한번 두는거라는 차이점이 있다.​신뢰할수 있는 테스트 진행, 무중단 배포가 가능하다는 전제 하에 Deployment 배포가 되어야한다.​배포시 고려해야할 사항애플리케이션 다운타임 최소화사용자에게 미치는 영향 최소화실패한 배포를 안정적으로 롤백하는 방법​무중단 배포의 전략다운타임 없이 서버를 운영할 수 있다.그러니까, 서버의 중단 없이 업데이트를 이루는 배포 전략을 말한다.   Rolling 배포서버를 차례대로 업데이트 시키는 방식. 장점 : 인스턴스를 추가하지 않아 관리가 간편 단점 ..
Spring Boot Actuator를 이용한 Kubernetes Pod의 Health check
·
kubernetes
Spring Boot AcutatorHealth Check와 상태 정보(Metrics) 제공 같은 공통 기능들을 마이크로서비스마다 각각 만드는건 비효율적이라, 쉽게 적용할 수 있는 프레임워크​Spring Cloud의 Component가 아니라, Spring Boot의 Component이다.​Spring Boot Actuator의 기능beans : Spring Bean 리스트 반환health : Health 상태 정보 반환metrics : Metrics 리스트 반환env : 환경변수 리스트 반환loggers : log설정 get/setthread dump : 쓰레드 상태 정보 반환​가장 많이 쓰이는 Metrics 기능은 Micrometer라는 오픈소스를 사용한다.http://micrometer.io Mic..
kubernetes Pod의 Graceful Shutdown (feat. Kafka)
·
kubernetes
Graceful Shutdown실행중인 어플리케이션이 새로운 애플리케이션을 위해 종료될때 자원 정리를 포함한 모든 조치가 취해진 ShutDown​배포때마다 수많은 오류가 뜬다는 것은 대체로 Graceful Shutdown이 제대로 이뤄지지 않고 있는 경우 발생한다. 배포 자동화 도구에서 대부분 해주지만 원리를 이해해야 트러블 슈팅에 대한 주체적인 근거를 댈 수 있다.​일단 들어온 트래픽은 모두 처리하고 종료해야 누락되지 않는다. ​예상되는 문제 상황요청에 대한 task 수행 도중에 Pod가 종료된다면 응답이 비정상적으로 처리될 수 있다.Pod가 종료될때 요청이 들어오면 connection refuesed 에러가 뜬다.​기존 로컬 환경에서의 해결 방법 - JVMJava Warm up을 3-5s 기다린다. ..
Service Mesh - Kubernetes가 있는데 왜 Istio가 필요한가요?
·
kubernetes
Istio가 Kubernetes에서 실행되는 이유가 뭔가?클라우드 환경에서 배포되는 애플리케이션 아키텍처에서 Kubernetes와 Service Mesh의 역할이 무엇인가?Istio는 Kubernetes의 어떤 측면(aspect)를 확장하는가? 혹은 어떤 문제점을 해결해주는가?Kubernetes, Envoy, Istio의 관계는 무엇인가?​대충 이런 궁금증​​​Service Mesh의 이해Service간의 마이크로화로 인해 Service의 수도 많아지고, 상호간의 연결 복잡도가 증가하면서 각 Service들을 효율적으로 관리할 필요가 생겼다. Service Mesh : Service를 발견-연결-모니터링하는 과정​애플리케이션에 대한 라우팅, 보안 및 안정성 기능을 추가하고 네트워크 흐름을 관리하고 제어하..
Docker 데몬 없이 컨테이너 이미지 빌드(kubernetes Docker 지원 중단)
·
backend
컨테이너화는 애플리케이션 배포의 필수적인 요소로 자리잡았고, Docker로 대표되는 가장 인기 있는 기술이다.​다른 k8s 문제에 대해 트러블 슈팅중에 뒤지다가 검색 키워드로 떠서 좀 찾아봤다.​kubernetes is deprecating Docker...네?kubernetes에서 docker 지원을 중단하려고 한다는 아티클을 발견해서 허겁지겁 들어가서 탐독했다.​​휴 다들 진정해 사격중지​아래 링크는 k8s 공식 문서에서 제공하는 번역본이다.https://kubernetes.io/ko/blog/2020/12/02/dont-panic-kubernetes-and-docker/​ 웃긴게, 하도 논란되니까 해명하는거 같은 내용이다.​k8s은 v1.20 이후 컨테이너 런타임(CRI)으로서 도커를 사용 중단(d..