
NettyNetty는 비동기 이벤트 기반 네트워크 애플리케이션 프레임워크로 고성능의 네트워크 프로그래밍을 지원하기 위해 이벤트를 활용해 비동기적으로 최소한의 리소스로 많은 연결을 처리할 수 있다. Spring 5.0에서 도입된 리액티브 프로그래밍 모델을 기반으로 동작하는 Spring WebFlux도 서버 구현을 위한 다양한 옵션을 제공하지만, Netty를 기본적으로 사용하는 서버 엔진이다.Netty가 어떻게 이벤트 루프를 통해 각 I/O 작업(예: HTTP 요청, 응답)을 비동기적으로 처리하는지 알아보자. Blocking I/O vs Non-Blocking I/O네티는 Java NIO 기반의 고성능 네트워크 프레임워크이다. Java NIO의 Channel과 Selector를 사용하여 비동기, 논블로킹을 ..

Consumer카프카에서 데이터를 읽는 애플리케이션을 토픽을 구독(subscribe)하고 구독한 토픽들로부터 메시지를 받기 위해 KafkaConsumer를 사용한다. 카프카에서 데이터를 읽는 것은 다른 메시지 브로커들과 조금 달라 이러한 개념들을 먼저 이해하지 않다면 컨슈머 API 사용법을 이해하는 것은 어려울 수 있다. 따라서 이러한 개념을 먼저 살펴보자. KafkaConsumer 생성public class SimpleConsumer { public static void main(String[] args) { String topicName = "simple-topic"; Properties props = new Properties(); props.setProp..

Prodcuer애플리케이션이 카프카에 메시지를 써야 하는 상황에는 여러 가지가 있을 수 있다. 감사 혹은 분석을 목적으로 한 사용자 행동 기록, 성능 메트릭 기록, 로그 메시지 저장, 스마트 가전에서의 정보 수집, 다른 애플리케이션과의 비동기적(asynchronous) 통신 수행, 임의의 정보를 데이터베이스에 저장하기 전 버퍼링 등이 있다.이러한 사용 사례들은 목적이 다양한 만큼 요구 조건 역시 다양하다. 신용카드 트랜잭션 처리하는 경우에는 어떠한 메시지 유실이나 중복도 허용되지 않으면서 지연 시간은 낮고, 처리율은 매우 높아야 한다. 반대로 웹사이트에서 생성되는 클릭 정보를 저장하는 경우에는 조금 유실되거나 중복이 허용될 수 있고, 사용자가 서비스를 이용하는데 문제만 없다면 메시지가 카프카에 도달하는데..

Kafka모든 애플리케이션은 의미가 있는 데이터를 만들고, 그 다음 처리되어야 하는 작업과 같이 뭔가 중요한 정보를 담고 있다. 따라서 해당 데이터에 알기 위해서는 데이터를 생성된 곳에서 분석할 수 있는 곳으로 옮겨야 하는 만큼 파이프라인(pipeline)이 중요한 핵심적인 요소가 된다고 할 수 있다. 실제 링크드인에서 하루 4.5조 개 이상의 이벤트 스트림을 처리하고 있기 때문에 기존의 Messaging Platform(ex: MQ)로는 처리가 불가능하여 데이터(이벤트) 스트림 처리를 위해 카프카(Kafka)가 개발되었다. Kafka vs RabbitMQKafka와 RabbitMQ 둘 다 메시지 전송 플랫폼을 제공하지만 위 그래프에서도 볼 수 있듯이 카프카가 초당 600MB로 처리량이 훨씬 높은 것을 ..

분산 환경에서의 트랜잭션모놀리식 아키텍처(Monolithic Architecture)의 일관성을 보장하기 위해 관계형 데이터베이스를 공유하는 것이 보통이다. 하나의 DB 트랜잭션으로 처리하는 경우에는 개발자가 ACID(원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability))을 보장하는 작업이 매우 단순해진다. 마이크로서비스 아키텍처도 마찬가지로 단일 서비스 내부의 트랜잭션은 ACID를 보장하지만, 여러 서비스의 데이터를 업데이트하는 트랜잭션을 구현 시 각 서비스마다 데이터베이스를 가지고 있기 때문에 데이터 일관성을 보장하기 까다로워진다. 분산 시스템 환경에서 트랜잭션과 데이터 일관성을 다루는 방법에 대해 알아보자. 2PC하나의 트랜잭션으로 데..

MSA(MicroService Architecture)기존 시스템들이 하나의 거대한 형태로 구축되어서 서비스되었다고 하면 마이크로 서비스라는 것은 전체 서비스를 구축하고 있는 개별적인 모듈이나 기능을 독립적으로 개발하고 운영할 수 있도록 세분화된 서비스라고 볼 수 있다. 일반적으로 사용하는 모놀리식 아키텍처와 MSA를 비교하고, MSA를 사용하는 이유에 대해 알아보자. 모놀리식 아키텍처(Monolithic Architecture)모놀리식 아키텍처는 모든 종류의 서비스가 하나의 애플리케이션으로 구성되어 있는 아키텍처를 의미하고 다음과 같은 특징이 있다.하나의 주요 프로세스로 구성모든 서비스가 하나의 DB 엔드포인트를 사용단 한줄만 코드 수정하더라도 모든 서비스 애플리케이션의 재배포가 따름싱글 혹은 멀티 모..

DockerDocker는 오픈소스 컨테이너화된 플랫폼으로 개발자는 어떤 환경에서도 해당 코드를 실행하는 데 필요한 애플리케이션 소스 코드와 운영 체제(OS) 라이브러리 및 종속성을 결합한 앱을 컨테이너로 패키지화할 수 있다. 즉, 어플리케이션을 개발하면서 여러 언어버전, 환경변수, 프레임워크 및 도구 간의 복잡한 인터페이스는 엄청난 복잡도를 해결하기 위해 Docker가 나오게 되었다. 예를 들어, 개발자가 로컬에서 어플리케이션을 개발하여 서버에 배포할 때, 로컬에서 잘 작동했는데 서버 환경에서는 잘 작동하지 않는 문제와 같은 문제를 Docker가 해결해줄 수 있다. Docker를 사용하는 이유가상화 환경 vs 컨테이너 환경처음 가상머신을 사용하는 이유 중 하나로는 언뜻 보기에 모순되어 보이는 조건인 격리..

RabbitMQRabbitMQ는 메시지 브로커(Message Broker)로서 매우 단순한 애플리케이션부터 대규모 시스템까지 다양한 분산 소프트웨어 아키텍처를 만들기 위한 매우 강력하고 가벼운 도구이다. RabbitMQ는 관리자 UI 플러그인과 함꼐 코어 어플리케이션을 구동하는데 40MB 미만의 메모리만 사용하여 가볍고, 이후 큐(Queue)에 전송되는 메시지양이 증가함에 따라 메모리 사용량이 점차 증가한다. 또한, 메시지를 배달하기 전에 디스크 또는 메모리에 저장하거나 클러스터를 설정할 때 큐를 HA(Highly Available)로 설정해서 여러 노드에 걸쳐 저장하도록 옵션을 설정하여 메시지 처리량 혹은 성능을 유연하게 제어하고 안정적으로 메시지를 전달할 수 있다. RabbitMQ 등장 배경 웹 사이..

JPA회사에서 Spring Data JPA와 QueryDSL을 사용하고 있다... Spring Data JPA와 QueryDSL을 공부하기 전 JPA에 대해 알아보고자 한다. MyBatis와 달리 JPA이 무엇이고, JPA를 사용함으로써 얻을 수 있는 장점과 사용 시 주의사항들에 대해서 살펴보자. SQL 중심적인 개발의 문제점과 대안자바를 사용하는 이유 중 하나인 객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공하여 객체 모델링으로 저장할 수 있다. 하지만 MyBatis와 같은 SQL 중심의 개발은 SELECT, INSERT, UPDATE, DELETE의 무한 반복과 위 사진처럼 객체의 필드가 테이블에 맞추어 모델링되므로 의존적이..
- Total
- Today
- Yesterday
- transaction
- 비관적 락
- spring webflux
- sql
- 넥스트스탭
- Synchronized
- 트랜잭션
- 구름톤 챌린지
- nginx configuration
- annotation
- jvm 메모리 구조
- 스프링 네티
- mysql
- Kafka
- NeXTSTEP
- socket
- 람다
- 구름톤챌린지
- TDD
- pessimistic lock
- Java
- nginx
- redis session
- postgresql
- spring session
- 자바 네티
- mdcfilter
- 네티 스레딩 모델
- 분산 락
- 카프카
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |