개-발

시나리오 A사용자가 B사용자에게 메세지 / 멘션 / 댓글 을 달면 B사용자에게 알림이 가는 API를 만들려고 한다. FLOW 웹을 열때 각 사용자는 SSE로 자기 이름으로 구독을 시작한다. A사용자가 B사용자에게 메세지 보냄 > 카프카에 메세지를 보냈다고 프로듀싱 > 카프카 컨슈머가 토픽을 Listen > SSE로 구독하고 있는 B사용자의 알림 메서드 보냄 > B사용자 종에 빨간불 ON 서버는 클라이언트에게 요청을 스스로 보낼 수 없다. 그렇기 때문에 중간에 소통을 해줄 기술이 따로 필요하다. Poling / WebSoket / SSE (Server Sent Events) 등이 있다. 이 세가지 기술을 모두 설명하진 않고 SSE를 채택한 이유는 알림 서비스는 [ 새로운 알림이 있는지 , 실시간성 보장 ..
CountDownLatch 숫자세는 걸쇠 CountDownLatch 는 언제 사용 할까 쓰레드를 N개 실행했을 때, 일정 개수의 쓰레드가 모두 끝날 때 까지 기다려야지만 다음으로 진행할 수 있거나 다른 쓰레드를 실행 시킬 수 있는 경우 사용한다. 예를들어서 리스트에 어떤 자료구조가 있고, 각 자료구조를 병렬로 처리한 후 배치(batch)로 데이터 베이스를 업데이트 한다거나 다른 시스템으로 push하는 경우가 있다. CountDownLatch 어떻게 사용 할까 ? CountDownLatch latch = new CountDownLatch(N); // 횟수 차감 latch.countDown(); //모든 작업이 끝난 후 실행시켜 주세요 latch.await(); CountDownLatch를 초기화 할 때 정..
문제발급 가능 수량은 100장의 쿠폰이 있다. 10000명이 동시 접근 할때 쿠폰 발급을 정상적으로 수행 가능하게 하려면 어떻게 해야 할까 ?냅다 코드를 짜버리면 이런식으로 100개 이상의 쿠폰이 발급되곤 한다.이에 많은 답변으로 싱글스레드인 Redis 분산 락을 사용하는데필자는 환경에 제한을 두어 In-memory와  RDB를 사용하여 해결하려고 한다.  쿠폰의 갯수 제한을 두는 방법을 2가지로 생각해 보았다.- 발급된 쿠폰갯수를 카운트 하기쿠폰을 발급할때마다 데이터 베이스에 조회를 따로 해야 하므로 네트워크 비용 , 부하가 발생할 수 있다.- 엔터티에 갯수를 넣어 카운트 하기  쿠폰 발급 시 전체 쿠폰 수를 조회하지 않아도 되므로 성능면에서 이점이 있다.하지만 추가 수량에 대한 대응 관리 기능을 추가..
문제 String 타입의 필드를 특정 형식으로 받아오고 싶은데 .... 이 문제를 Controller 에서 처리 하기엔 코드가 복잡해 졌다. @Constraint 어노테이션을 활용하여 커스텀 Validatation을 만들자 Controller 에서 dto를 요청으로 받아올때 String 값을 yyyy-MM-dd HH:mm 이런 형식으로 받아오고 싶었다. 1. 어노테이션 만들기 // CustomDateTimeFormat.java @Constraint(validatedBy = DateTimeFormatValidator.class) @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface CustomDateTimeForma..
문제 시나리오 사용자의 네트워크 지연 사용자의 잘못된 조작 중복요청이 발생 할 경우 데이터의 동시성 문제로 일관된 데이터가 입력이 될 수 있기 때문에 중복요청을 방지 하고자 했다. 많은 방법이 있지만 Spring AOP (Aspect-Oriented Programming)를 활용하여 문제를 해결하고자 했다. @Aspect @Component public class DuplicateRequestAspect { private Set requestSet = Collections.synchronizedSet(new HashSet()); @Pointcut("within(*..*Controller)") public void onRequest() {} @Around("onRequest()") public Object..
이전 글 처럼 간단하게 스크립트 실행만 해줘도 되지만 실행이 완료 / 실패 상관없이 pipline이 완료가 된다. deploy.sh 파일의 실행 로그를 보려면 verbose 옵션을 주어야 한다. pipeline { agent any stages { stage('Clone') { steps { script { git branch: 'develop', credentialsId: 'github', url: 'https://github.com/sudosoo/ElasitcKafka.git' } } } stage('ConfigAppender') { steps { script { sshagent(credentials: ['ssh_key']) { def workspaceDir = "${JENKINS_HOME}/work..
이번 장에서 만들 파일들은 한경로에 넣어준다. 젠킨스 파이프 라인 스크립트 pipeline { agent any stages { stage('Clone') { steps { script { git branch: 'develop', credentialsId: 'ljh8651', url: 'https://github.com/sudosoo/ElasitcKafka' } } } stage('Build') { steps { script { sh './gradlew clean bootJar' } } } stage('Deploy') { steps { script { sshagent(credentials: ['ssh_key']) { // 파일 전송 'scp -o StrictHostKeyChecking=no -P 포트 ..
CICD란 ? CI/CD는 소프트웨어 개발의 일환으로 사용되는 프로세스의 한 형태이다. CI는 "지속적 통합(Continuous Integration)"을 나타내며, CD는 "지속적 배포(Continuous Deployment)" 또는 "지속적 전달(Continuous Delivery)"를 나타낸다. 무중단 배포의 원리 배포 할 때, 새로운 컨테이너를 띄우고 NginX(로드밸런서)로 새로운 띄운 컨테이너로 연결한 뒤 이전 컨테이너는 내린다 글 들어가기 앞서 앞에 아래 글 들이 선행 되어야 한다. https://soobysu.tistory.com/119 [NginX] docker NginX (NPM) 역방향프록시 개념과 설정 NAS 1 Nginx의 역방향 프록시의 개념은 이러하다. 원래라면 http://m..
imSoo
'개-발' 카테고리의 글 목록 (7 Page)