일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- macrotask
- 1781
- Bitwise AND
- firebase functions deploy limit
- microtask
- 25635
- firebase functions
- 코드리뷰를꼼꼼히하자
- graceful shutdown
- 전역에러처리
- eventLoop
- 23289
- 귀납적증명
- 23560
- Docer
- 20309
- nextTick
- 알고리즘
- promise.race
- node-cron
- 백준
- BOJ
- node.js
- 파라매틱서치
- Java
- ad-hoc
- hash
- 25186
- PS
- Kafka
- Today
- Total
목록개발 (8)
웰제오의 개발 블로그
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bTIoCH/btsxvGuDPYA/yUOEzm4bfFVgrWAso4sd51/img.png)
*************************** APPLICATION FAILED TO START *************************** Description: Parameter 0 of method entityManagerFactory in ... required a bean of type 'org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder' that could not be found. Action: Consider defining a bean of type 'org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder' in your configuration. 작업도중 위와 같은 에..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ckbBWU/btrPRB903wE/sQsLaNYk9jyEUy37a7xcI1/img.png)
카프카의 group coordinator 는 현재 그룹에 속해있는 컨슈머들의 상태가 유효한지 계속 확인하며, 리밸런싱을 통해 그룹내에 속한 모든 컨슈머들이 유효성을 보장한다. 만약 카프카가 컨슈머들이 살았는지 죽었는지 확인을 안한다면, 죽어있는 컨슈머가 group 파티션을 계속 잡고있게 되며, 해당 파티션의 record 들이 consume 되지 않는 상황이 발생하므로, 카프카는 주기적으로 컨슈머의 생존여부를 확인해, 죽었다고 판단되는 컨슈머를 group 에서 쫓아내고, 리밸런싱을 통해 이전 컨슈머에게 할당된 파티션을 그룹내의 다른 컨슈머에게 할당해주어야 한다. 카프카는 컨슈머가 죽었다고 판단하는 경우가 두가지가 있는데 (connections.max.idle.ms 설정도 존재하지만 제외하고 얘기하겠다) 이..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ZvF1A/btrPEIo5mRf/WkIwJVke1sy4eunQk0XRM1/img.png)
대부분의 백엔드 시스템은 24시간, 365 일 쉬지 않고 돌아간다 (물론 서버리스 아키텍처로 구성된 시스템은 예외) 이러한 프로그램을 운영하다 보면 정말 기상천외한 이슈들을 계속 마주하게 되는데, 그 중에서는 정확한 원인파악을 통한 문제를 해결이 불가능한 상황에서, 우선 큰 그림에서 문제를 우회할 수 있는 방식으로 로직을 수정해 이슈를 해결하는 경우가 있었다. 이번 글에서는 이전에 경험했던 이슈를 바탕으로, Node.js 환경에서 스레드의 hang 을 야기할 수 있는 작업들을 어떻게 핸들링할 수 있는지 공유하려고 한다. 이슈 상황 필자가 운영했던 프로그램은 미션 크리티컬한 프로그램으로서, 해당 프로그램의 특성을 고려해, pre defined 된 에러상황이 아니라면, 발생하는 모든 예외상황에 대해 프로그램..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/mpLs9/btrPgZYNcrp/d0tB0vSNkkNoWEsIA95WyK/img.png)
Google 에서는 Firebase 라는 모바일 및 웹 어플리케이션을 손쉽게 제작할 수 있게 도와주는 PaaS 를 제공한다. Firebase 하나로 인프라의 구성 및 유지보수에 전혀 신경쓰지 않고 빠르게 서비스를 빌딩할 수 있고, GCP 에서 제공하는 functions 라는 서버리스 컴퓨팅 서비스를 활용해( AWS Lambda 라고 생각하면 된다 ) 백엔드 API 구성 없이 웹 또는 모바일 어플리케이션에서 DB 에 다이렉트로 접근해 읽기, 쓰기, 삭제와 같은 작업이 가능하다. 위와 같은 편리성으로 인해 많은 중소규모 서비스에서 해당 플랫폼을 애용하고 있지만, 서비스의 크기가 증가함에 따라 배포 관련해서 필연적으로 마주하게 되는 이슈가 하나 존재한다. Firebase 에서 제공하는 NoSQL 데이터베이스인..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bbJJPp/btrPfCXewSH/m2H0lKNkbQvSHJssvfmtUk/img.png)
AWS ECS 는 Elastic Container Service 의 줄임말로, AWS 에서 제공하는 컨테이너 오케스트레이션 ( Container Orchestration ) 서비스이다. 비슷한 컨테이너 오케스트레이션 서비스로는 도커 스웜 ( Docker Swarm ) 과 그 유명한 쿠버네티스 ( Kubernetes ) 가 있다. ECS 는 중소규모 프로젝트에서 컨테이너 오케스트레이션을 수행하기에 적합하며, 러닝커브가 매우 낮다는 장점이 있다. 이번 글에서는 AWS ECS 를 활용해 Docker 컨테이너들을 운용하면서 겪었던 graceful shutdown 설정과, 해당 로직이 수행되지 않았던 이슈의 원인과 해결책에 대해 공유하고자 한다. graceful shutdown 이 필수인가? 일반적으로는, for..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/oNbLY/btrOFkwfAQc/xf2CM1jd4DdQgO2aktoz4k/img.png)
Node.js 는 현대 웹 백엔드 서버가 처리하는 작업의 대부분이 Network IO 작업에 국한된다는 문제를 해결하기 위해 나온 Javascript 런타임이다. 이러한 Node.js 는, 싱글스레드로 동작하는 이벤트 루프를 기반으로 Network IO 를 포함한 여러 비동기 작업들을 Syntax-sugar 가 가미된 편리한 문법을 통해, 복잡한 비즈니스 로직을 포함한 웹 백엔드 프로그램을 개발자가 보다 쉽게 개발할 수 있게 도와준다. 프론트엔드를 독점한 Javascript 와의 시너지에 더불어, 하나의 언어를 익힘으로서 프론트와 백을 포함한 풀스택 개발을 가능하게 해준 Node.js 는, 어느 덧 단순한 요청작업을 처리하는 서버 프로그램을 넘어, 복잡한 비즈니스 로직을 처리하는 프로그램에 까지 사용되면..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bkfmaC/btrNzFaD9yZ/SM4gNdk4UzQRI5SaT6qUMK/img.jpg)
Kafka 에서는 쉘스크립트를 통해 다양한 Kafka 리소스들을 CLI 를 통해 제어할 수 있게 도와준다. kafka-consumer-groups.sh 는, Kafka CLI 중 group 관련된 리소스 제어를 제공해주는 쉘 스크립트 인데, --describe 옵션을 통해 group-id, topic, partition, offset, lag 과 같은 정보들을 제공해주며, Kafka 의 운영 및 모니터링에 있어서 정말 많이 사용하는 스크립트 이고, 필자도 Kafka 관련 이슈가 발생하면 제일 먼저 해당 스크립트를 찾았었다 // 실행 예시 // ./kafka-consumer-groups.sh --bootstrap-server {BOOTSTRAP_SERVER} --describe --group {GROUP_..
프로그래밍에 있어서 예외 ( 에러 ) 처리는 필수적이다. 일반적으로는 try/catch 문으로 처리하곤 하지만 이는 코드의 가독성을 떨어트리고, 매번 로직을 작성할 때 마다 발생할 수 있는 예외상황에 대한 코드를 작성해야 하고, 공통되는 상황에 있어서도 매번 같은 코드를 작성해야하는 불편함 또한 존재한다. 어쩔때는 catch 문 작성을 깜빡하는 실수를 하기도 한다.. 이러한 단점들로 인해 많은 언어, 프레임워크 에서는 전역적인 에러처리를 지원해준다 Spring 을 사용해본 사람이라면 @RestControllerAdvice 라는 어노테이션을 들어봤을 것 이다 @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(FooEx..