728x90
대용량 트래픽을 처리하는 방법대용량 트래픽 상황에서 시스템의 성능과 안정성을 유지하기 위해서는 다양한 방법이 있다. 특히나 어떤 트래픽 상황인지에 따라서 방법을 선택할 수 있으며, 상세 상황이 설정되지 않았을 때의 대표 처리 방법을 알아본다. 크게 5가지로 볼 수 있다단일 애플리케이션 자체의 성능 최적화서버 증설(수평 확장)과 로드 밸런싱의 적용메시지 큐 도입데이터 베이스의 복제 증설캐싱 이용 1️⃣. 단일 애플리케이션 자체의 성능 최적화가장 대표적인 방법으로, 현재 애플리케이션 자체의 성능을 증가시키는 방법을 찾을 수 있다.특히나 해당 서버의 스펙 자체가 굉장히 우수한 편인 상황에서, 애플리케이션 자체의 응답 속도가 느린 것으로 파악되었다면 필히 개선점을 찾아보아야 할 것이다. 예를 들어 내부 복잡한 ..
데이터베이스의 트랜잭션 격리 수준1️⃣ Read Uncommitted (읽기 미완료)가장 낮은 격리 수준으로, 하나의 트랜잭션이 아직 커밋되지 않은 데이터임에도 다른 트랜잭션이 읽을 수 있다이 시점에서는 Dirty Read 라고 하여, B트랜잭션이 아직 커밋되지 않은 A트랜잭션의 데이터를 읽어버렸는데 A트랜잭션이 롤백되었다면 잘못된 데이터를 읽은 것이 되버린다. 이 문제는 Read Committed 단계에서 해결할 수 있다2️⃣ Read Committed (읽기 완료)한 트랜잭션이 커밋된 데이터만 읽은 수 있다. 커밋되지 않은 데이터는 다른 트랜잭션이 접근하지 못한다. 그러나 동일 트랜잭션에서 동일 데이터를 두 번 읽을 때, 다른 트랜잭션이 데이터를 수정해버렸다면 읽은 값이 달라져버린다. 이를 Non-r..
다 된 줄 알았는데 😑(모바일):제가 STOMP Connect가 된 건지 안 된 건지 모르겠어요🍊: 어, Swift 라이브러리 stompClientDidConnect 등의 메소드로 수신되지 않으시나요?😑(모바일): 연결이 끊겨도 걔가 이미 연결되어있는 것처럼 응답이 와요.🍊..... 😱: 헐😑(모바일): 그래서 재연결할 타이밍을 못 잡아요🍊: 잠시 기다려주세요, 방법 찾아볼게요. 왜 그랬을까? WebSocket Server에서 Connection 'close' 이벤트를 받지 못할 때(2020-08-17에 작성된 글입니다) WebSocket 서버를 운영하다보면 가끔 Client WebSocket Connection이 끊겨졌음에도 서버에서는 close이벤트를 수신하지 못할 때가 있다. 아마 W..
JPA의 영속성 컨텍스트영속성 컨텍스트는 JPA가 Entity 객체를 상태관리하는 공간 및 매커니즘이다.자세히는 엔티티의 상태를 메모리 상에 올려 놓고, Datsbase와의 동기화를 관리하는 공간으로 볼 수 있다. 이 공간에 올라간 객체는 변경 사항을 추적할 수 있게 되고 트랜잭션이 끝나는 시점에 Database에 반영된다. 1. 영속성 상태JPA의 영속성 컨텍스트 내에서 관리되는 Entity는 네 가지의 상태를 갖는다비영속(Transient)Database와 전혀 관련이 없는, 단순 메모리 상에만 존재하는 상태영속(Persistent)영속성 컨테스트에 의해 관리되고 있는 상태준영속(Detached)영속 상태에서 벗어나 분리된 상태삭제(Removed)Database에서 삭제 예정인 상태(트랜잭션이 커밋..
낑AWS의 로드밸런서 서비스를 이용중이었다. 그리고 그 앞단에서 로드밸런서에 요청정보를 전달하는 Apache가 있었다. 😶: 인쟈 트래픽에 따라서 로드밸런서가 알아다가 분산하겠징 라고 생각했는데, 근 며칠동안 새벽마다 통신장애가 일어나 어느 시점부터 503 코드로 반환되었다. 귀신같이 퇴근만 하면 고장나는 서버에 뭐라도 씌인 것인 건가 싶었다. 연결된 네트워크에 안면인식기능이 탑지된 것 마냥 자정에 건물 문이 잠길 때까지 기다려도 눈앞에서 재연되지 않는 상황에 모두가 넋이 나갔다.현지 시간대를 노린 누군가의 침입에 의한 것인가 싶어 access_log, error_log 를 다 뒤져보면 그 언저리 반갑지 않은 손님들의 소스 긁기를 위한 GET: 시도가 보이긴 하지만 그게 원인은 아니었다. 우선은 Ap..
Scheduler 설정 구조@DependsOn({"..."})@Configurationpublic class ConfigScheduling { @Bean public JobDetail ...JobDetail(){ return JobBuilder.nowJob(잡.class) .withIdentity(잡.class.getSimpleName()) .storeDurable(true) .build(); } @Bean public Trigger ...JobTrigger(){ ... return trigger.newTrigger() .withIdentity(잡.c..