23일 전 · 허찬영 님의 새로운 댓글
채팅 애플리케이션에서 Redis 메시지 저장과 RabbitMQ 전송을 안전하게 처리하려면 어떻게 해야하나요?
안녕하세요. 현재 백엔드 개발자를 지망하는 대학생입니다.. 예전에 Springboot를 활용해서 개발한 채팅 애플리케이션 프로젝트를 리팩토링하는 과정에서 문제가 발생하여 질문 드립니다. 아래와 같은 아키텍처 애플리케이션을 구현했습니다. - MySQL: 채팅방 정보(채팅방 이름, 참여 인원수 등등), 사용방 정보 데이터 저장. - Redis: 채팅 메시지 데이터 저장 - RabbitMQ: 채팅 메시지를 전송하기 위한 메시지 브로커 STOMP over WebSocket을 활용해서 클라이언트에서 메시지를 pub해서 메시지 브로커인 RabbitMQ를 거쳐서 구독한 클라이언트에게 메시지(채팅)을 전송하도록 구현했습니다. 그런데 문제가 발생하는 로직이 있습니다. [채팅방 가입 로직] 1. @Transactional 내부에서 MySQL에 채팅방 데이터 저장. (해당 유저가 채팅방에 가입한 것을 저장) 2. Redis에 "User가 채팅방에 들어왔습니다."라는 메세지를 저장. 3. 해당 메시지를 RabbitMQ로 전송. (`rabbitTemplate.convertAndSend(...)`) 이런 상황에서 Redis나 RabbitMQ에서 문제가 발생해서 하나라도 정상적으로 완료되지 않으면 문제가 발생합니다. Redis 서버에 문제가 생겨서 채팅 메시지를 정상적으로 저장하지 않더라도 RabbitMQ를 통해 메시지가 전송되고, RabbitMQ 서버에 문제가 생겨서 정상적으로 전송되지 않더라도 Redis에 채팅 메시지가 저장이 됩니다. 이러한 문제를 해결하기 위해서 2PC, SAGA 패턴, Outbox 패턴 등등을 알아봤고, 그 중 가장 괜찮다고 생각했던 패턴이 Outbox 패턴이었습니다. 근데 또 어려움이 생겼는데, Outbox 패턴을 사용하기 위해 Pulling 기법을 사용 하자니 Redis에 무리가 생길 것 같고, 트랜잭션 로그 테일링 패턴을 사용 하기에는 Redis가 이를 제대로 지원하지 않아 구현이 굉장히 어려워진다는 문제가 생겼습니다. 그래서 MySQL을 Outbox 저장소로 사용할까 고민도 해보았는데, MySQL을 사용하면 속도 면에 불리해지지 않을까라는 생각이 또 들었습니다. 이러한 문제를 어떻게 해결하면 좋을까요...? 제가 궁금한점은 다음과 같습니다. 1. Redis를 활용하는 프로젝트에서 MySQL을 Outbox 저장소로 사용하는 것은 좋지 않은 방법일까요? 2. Outbox 패턴이 최선일까요? 현업에서는 이러한 문제를 어떤 식으로 해결하는지 궁금합니다.
개발자
#spring
#rabbitmq
#redis
#mysql
#transaction
답변 1
댓글 1
조회 100
3달 전 · 원승현 님의 질문
웹소켓 + Stomp로 채팅 기능을 구현하며
RabbitMQ를 도입하였습니다. 도입의 이유는 스프링 내장 메시지 브로커를 이용하게 되면 인메모리 기반의 동작 방식으로 인해 서버 문제 발생 시 메시지가 유실되거나 확장에도 제한이 있다고 판단하여 도입하였습니다. 현직자 분들이 보기에 이 이유가 적합한 근거가 될까요? 추가로 JMeter로 RabbitMQ를 사용했을 때와 사용하지 않았을 때의 성능을 비교했는데 사용자 100명 기준 성능도 사용하지 않았을 때가 우세했고, RabbitMQ를 사용했을 때는 오히려 아래와 같은 오류가 가끔 발생하며 메시지또한 약 90퍼센트 정도만 저장된걸 확인할 수 있었습니다. 무엇이 문제이며 해결 방안이 있을까요?? java.net.SocketException: Connection reset at java.base/sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.java:394) ~[na:na] at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:426) ~[na:na] at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:255) ~[netty-buffer-4.1.114.Final.jar:4.1.114.Final] at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132) ~[netty-buffer-4.1.114.Final.jar:4.1.114.Final] at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:356) ~[netty-transport-4.1.114.Final.jar:4.1.114.Final] at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151) ~[netty-transport-4.1.114.Final.jar:4.1.114.Final] at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788) ~[netty-transport-4.1.114.Final.jar:4.1.114.Final] at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) ~[netty-transport-4.1.114.Final.jar:4.1.114.Final] at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) ~[netty-transport-4.1.114.Final.jar:4.1.114.Final] at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) ~[netty-transport-4.1.114.Final.jar:4.1.114.Final] at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.114.Final.jar:4.1.114.Final] at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.114.Final.jar:4.1.114.Final] at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.114.Final.jar:4.1.114.Final] at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]
개발자
#채팅
#구현
답변 0
댓글 0
조회 79
7달 전 · 형준 님의 질문 업데이트
프로젝트 경험이 부족한 4학년 전공자 부트캠프를 해야 할까요?
안녕하세요 경기도권 대학 컴퓨터공학과에 재학중인 4학년 학생입니다. 우선 현재 제 상황을 설명해보겠습니다. 프로젝트는 총 두 번 진행했습니다. 첫 번째 프로젝트는 Django와 chatGPT를 이용한 프로젝트이고 전 이 프로젝트에서 기본적인 API 구현, chatGPT 연동 그리고 rabbitMQ와 celery를 이용하여 chatGPT의 답변을 비동기로 가져오는 기능을 구현했습니다. 두 번째 프로젝트는 Springboot와 Flask와 RVC(음성 변환 AI 오픈소스)를 이용한 프로젝트를 진행했습니다. SpringBoot는 REST API를 작성하는 서버이고 Flask는 RVC AI 모델 서빙만을 위한 서버입니다. 이 프로젝트에서 SpringBoot REST API 구현, CRUD 구현과 Flask 서버 구현을 맡아서 진행했고 AWS EC2 배포, S3, RDS, DOCKER(Compose), Nginx, Github Action(CI/CD)도 구현했습니다. 올해 여름 방학에 알고리즘 스터디를 통해서 주요 자료구조와 알고리즘에 대해 공부하고 공부한 내용을 블로그에 정리했습니다. 코테 문제는 대략 100문제 조금 안되게 풀었습니다. 대충 실력은 실버 4~2까지는 어찌저찌 풀 수 있는데 실버 1 골드 5는 쉬운 건 풀고 어려운 건 못 푸는 수준입니다. 현재는 CS 스터디 진행중이고 이제 시작하는 단계입니다. 자격증은 정처기 있고 올해 11월 SQLD 응시 예정입니다. 첫 번째 프로젝트는 포폴로 쓰기 애매하고.. 두 번째 프로젝트는 Devops 경험은 충분한 것 같은데 Spring으로 구현한 기능은 아주 기본적인 REST API밖에 없고 Flask(AI)가 메인이다 보니 제대로 된 Spring 프로젝트가 없습니다.그래서 제대로 된 Spring 프로젝트를 만드는 게 우선이라 생각합니다. 그럼 혼자서 사이드 프로젝트를 하거나 부트캠프에 들어가서 기초부터 차근차근 배운 후 팀 프로젝트를 진행하는 방법이 있는데 어떻게 해야 할지 고민입니다. 부트캠프는 거의 대부분이 기초부터 하는 커리큘럼이다 보니 최소 6개월은 해야 한다는 단점이 있고 혼자 하는 건 주변에 물어볼 곳도 없고 좀 막막합니다. 대신 결과물이 조그 부족하더라도 6개월보단 덜 걸릴 것 같습니다. 조언 부탁드립니다..
개발자
#부트캠프
#국비
#전공자
#취준
#취업
#전공
답변 0
댓글 0
추천해요 1
조회 204
3년 전 · 지찬규 (피트웨어 제이) 님의 답변 업데이트
스타트업 1년차 커리어 조언 부탁드립니다!! (주니어개발자, 오버스펙등)
- 경력 스타트업 1년 4개월정도 재직 중인 주니어 개발자 - 개발팀 인원 cto, 개발팀장, 팀원 5명(백4, 프론트1) - 사용한 기술 스택 spring mvc, jpa, spring webflux, r2dbc, postgresql, mongodb,kafka, elasticsearch, logstash, docker, rabbitmq, redis - 현재까지의 상황 사내에 기술적으로나 커리어적 방향성을 물어볼 사람이 없어서 질문 올립니다. 어플리케이션 90 프로가 웹플럭스로 개발이 되었으며 mvc개발에 대해서는 작은 어플리케이션 개발이 전부였습니다. cto는 전적으로 개발팀장에게 전적으로 의존해서 기술스택 모두 팀장이 정했습니다. 팀원으로 기술 선택에 의견을 내기도 했지만 권위적인 태도거나 저의 지식이 부족해서 근거 없이 받아들이기도했습니다. 또한 일방적인 개발 팀장의 기술 선택에 cto도 크게 반발 없이 받아들였습니다. 매 프로젝트마다 팀원 모두가 사용 경험이 없는 새로운 기술스택이 도입되었고, 심지어 러닝커브를 고려한 일정을 잡아주지 않았습니다. 기술을 깊게 탐구해가며 쓰지 못하고 다음 프로젝트 하기 바쁜 일정이어서 이직 준비하기는 현실적으로 힘들었습니다. 사용한 기술 스택은 맞지만 딥다이브한 기술이 없으며, 이직을 위한 기술스택 (mvc, jpa 등)을 현재 업무에서 사용할 여지는 없어 보여서 아래와 같이 계획을 짰습니다. 제가 생각한 방향성이 맞는지 선배님들 조언 부탁드립니다. 1. 이력서에는 깊게 사용하지않은 기술스택은 뺀다. 2. 이직을 위한 기술 스택(mvc, jpa등) 사이드 프로젝트로 실제 사용자에게 출시한다는 생각으로 공부해서 포트폴리오화 한다.
개발자
#주니어
#이직
답변 1
댓글 0
추천해요 10
조회 2,409
3년 전 · 이상헌 님의 답변 업데이트
클라우드의 완전 관리형 서비스들을 대기업에서 많이 사용하나요?
클라우드 기업에서 제공하는 완전 관리형 서비스들을 대기업에서도 많이 사용하나요? 예를 들어, i) 메시징 큐를 위해서 EC2 인스턴스나 온프레미스 환경에 직접 RabbitMQ를 세팅 vs그냥 AWS SQS를 사용 ii) 캐시 서버를 위해서 Redis 서버를 직접 구축 vs 그냥 AWS ElastiCache를 활용 등등 지금 취업준비 하며 AWS 공부하면서 다양한 AWS 서비스들을 접하고 있는데, 물론 케이스 바이 케이스겠지만 "되도록이면 직접 다 하자" 이거나 "이미 있는걸 잘 써먹자" 하는 그런 분위기? 같은게 있을지 궁금합니다. 뭔가 대기업에서는 서비스 운영을 클라우드 종속시키지 않고 직접 운영하는 것을 선호할 거 같기도 하고, 아니면 반대로 대기업은 비용문제에서 비교적 자유로우니 그냥 적극적으로 사용할 거 같기도 하고 해서 질문드립니다!
개발자
#백엔드
#aws
답변 1
댓글 0
추천해요 1
조회 215