Backend (51) 썸네일형 리스트형 카프카 오프셋 커밋과 메시지 손실, DLT 프로젝트에서 카프카를 사용 중인데 처음 사용해보는거라 아직 모르는 부분이 많다. 카프카를 사용해보며 들었던 의문들을 정리해보고자 한다.자동 커밋 vs 수동 커밋카프카의 자동 커밋(auto commit) 기능을 사용하면, 메시지를 소비한 후 일정 주기마다 오프셋이 자동으로 커밋된다. 이 과정에서 메시지를 가져온 후 처리하는 과정에 예외가 발생하더라도, 이미 오프셋이 커밋되었기 때문에 해당 메시지를 다시 소비할 수 없는 문제가 발생한다. 예제를 통해 살펴보자. 다음은 카프카 설저어 코드와 리스너 코드이다.@EnableKafka@Configurationpublic class KafkaConsumerConfig { @Bean public ConsumerFactory consumerFactory() {.. Redis Stream을 메시지 브로커로 사용하기 0. 개요이 글은 프로젝트를 진행하며 메시지 브로커로 Redis Stream을 활용한 경험을 작성한 글이다. 메인 서버(가챠 서버)에서 사용자가 특정 등급의 아이템을 모두 획득한 경우, 로또를 발급해준다. 이때 로또 발급 로직을 별도의 프로세스로 진행하고자 로또 서버를 생성했다. 그리고 메시지 브로커로 두 서버 간 통신을 이뤄 비동기 통신을 구현하고자 했다. Kafka, RabbitMQ 등의 메시지 브로커가 있는데, 기존에 Redis를 사용 중이었기 때문에 Redis를 활용했다. Redis의 pub/sub과 stream을 메시지 브로커로 사용할 수 있다.1. Redis Stream일반적으로 레디스를 이용해 메시지를 발행할 때는 pub/sub을 많이 사용한다. 하지만 이 방식은 메시지를 발행했을 때 수신자.. 카프카란 무엇인가? 카프카의 탄생 배경카프카는 미국의 대표적인 소셜 네트워크 서비스인 링크드인에서 처음 시작된 기술로, 링크드인 서비스가 급속도로 성장하면서 발생하게 된 여러 이슈들을 해결하기 위해 탄생했다. 링크드인 서비스가 성장하면서 어떤 상황에서 어떤 새로운 시스템에 대한 개발 요구가 높아졌길래 카프카가 탄생하게 된 것일까? 다음 그림은 카프카가 개발되기 전 링크드인의 시스템 구성도이다. 카프카 등장 전에는 각 서비스가 엔드투엔드로 연결되어 있었다. 이러한 엔드투엔드 연결 방식의 아키텍처는 많은 문제점이 있었다.첫 번째로, 통합된 전송 영역이 없으니 시스템 복잡도가 증가할 수밖에 없다. 따라서 문제를 발견하기 위해서는 이와 관련된 여러 데이터 시스템을 확인해야 했다.두 번째로, 데이터 파이프라인 관리의 어려움이다. .. 스프링 스케줄러(@Scheduled) 사용 시 주의사항 1. 여러 스케줄링 작업이 있을 때 싱글 스레드로 인한 문제* 참고: https://olsohee.tistory.com/239 스프링은 스케줄링 작업을 위한 TaskScheduler라는 인터페이스를 제공하고, 구현체로는 다음 두가지가 사용된다.가상 스레드가 활성화된 경우(Java 21 이상 및 spring.threads.virtual.enabled가 true로 설정된 경우), SimpleAsyncTaskScheduler가상 스레드가 활성화되지 않은 경우, ThreadPoolTaskScheduler그리고 ThreadPoolTaskScheduler는 기본적으로 하나의 스레드를 사용하며, spring.task.scheduling을 통해 설정 값을 변경할 수 있다. If virtual threads are en.. 레디스에서 다중 명령에 대한 원자성을 보장하는 방법 레디스는 싱글 스레드로 동작하므로 동시성 제어를 위한 복잡한 설계와 오버헤드가 적다. 그러나 싱글 스레드는 parallel 할 수 없는 것이지 concurrent 할 수 있다. 즉, 여러 레디스 클라이언트가 있고, 각 클라이언트가 여러 개의 명령을 한 번에 보낸다면, 레디스의 싱글 스레드는 여러 클라이언트들의 명령을 번갈아 하나씩 실행하게 되며 동시성 문제가 발생할 수 있다. 이를 방지하기 위해 크게 Redis Transaction과 Lua Script 2가지를 사용할 수 있다.Redis Transaction트랜잭션은 주로 관계형 데이터베이스에서 많이 쓰이는 용어인데, 레디스에서도 트랜잭션을 사용할 수 있다. 레디스에서 트랜잭션을 사용하면 여러 개의 커맨드에 대해 원자성이 보장된다. 따라서 concurr.. @Async, @Scheduled의 스레드에 대해 비동기 작업을 위한 스레드스프링은 비동기 작업을 위한 TaskExecutor라는 인터페이스를 제공한다. 스프링의 TaskExecutor 인터페이스는 자바의 Executor 인터페이스와 동일하다. 그리고 스프링이 제공하는 TaskExecutor의 구현체는 다음과 같다.SyncTaskExecutorSimpleAsyncTaskExecutorConcurrentTaskExecutorThreadPoolTaskExecutorDefaultManagedTaskExecutor...@EnableAsync의 JavaDoc을 살펴보면 다음과 같이 설명되어 있다.By default, Spring will be searching for an associated thread pool definition:* either a uniqu.. 도커 네트워크 네트워크에서 IP 주소의 고갈을 막기 위해 사설 IP와 공인 IP를 나누는 NAT이라는 개념이 등장했다. 도커에서도 이와 유사하게 하나의 컴퓨터에서 여러 개의 컨테이너를 구동하는 경우, 각 컨테이너마다 IP 주소가 할당되는데, 이 IP 주소는 도커가 설치된 호스트 내에서만 쓸 수 있는 IP로 외부와의 통신이 불가능하다. 그러면 각 컨테이너는 어떻게 외부와의 네트워크 통신이 가능한 걸까? eth0호스트의 eth0은 실제 우리가 외부와 연결할 때 사용하는 호스트 네트워크 인터페이스이다.컨테이너 안에 eth0은 veth 가상 인터페이스를 통해 외부와 통신할 수 있게 되는 것이다.veth컨테이너가 시작될 때마다 호스트에 veth(virtual eth)라는 가상의 네트워크 인터페이스가 생성된다.컨테이너가 외부와 .. 도커 알아보기 하나의 컴퓨터 위에서 여러가지 응용 프로그램을 실행시키고 싶을 수 있다. 이는 운영체제도 마찬가지이다. 맥 위에서 윈도우를 실행시키고 싶을 수도 있고, 반대로 윈도우 위에서 리눅스를 실행시키고 싶을 수도 있다. 동시에 여러가지를 실행시키는 가장 단순한 방법으로, 하드웨어를 여러 개 사서 하나에 하나씩 돌리는 무식한 방법이 있다. 그러면 하드웨어에 상관없이 하나의 하드웨어 위에 여러 개의 응용 프로그램을 돌리는 방법을 알 수 있다면 모든 것이 해결되지 않을까? 따라서 하나의 컴퓨터 자원을 마치 여러 개인 것처럼 가상으로 쪼개서 사용할 수 있도록 하는 가상화 기술이 필요하다.가상화가상화 기술은 하나의 물리적 하드웨어에서 여러 개의 논리적 가상 시스템을 생성하고 관리하는 기술이다. 이를 통해 하나의 물리적 하.. 이전 1 2 3 4 ··· 7 다음