마인드 맵 갤러리 연봉 500,000~700,000의 Java 설계자 p5-p7 승진 경로
연봉 500,000~700,000의 Java 설계자 p5-p7 발전 경로, 실용적인 데이터 구조 및 알고리즘, 마이크로 서비스 솔루션 데이터 구조 모델, JVM 가상 머신 실용적인 성능 튜닝. 동시 프로그래밍 실습, 마이크로서비스 프레임워크 소스 코드 해석, 컬렉션 프레임워크 소스 코드 해석, 분산 아키텍처 솔루션. 인터넷 분산 트랜잭션 아키텍처 설계 및 실제 구현, 분산 메시지 미들웨어 원리, MySQL 실제 성능 최적화 및 Netty 심층 소스 코드 해석.
2023-11-21 16:53:38에 편집됨JAVA 아키텍트로서 발전하는 길
데이터 구조 및 알고리즘 실습
수학 지식 복습
색인
로그
시리즈
모듈로 산술
복잡성
시간 복잡도
공간 복잡도
데이터 구조
스택 모델
선입선출 원칙
팝/푸시
스택 애플리케이션
대기열 모델
선입선출 원칙
순차 대기열
연결된 대기열
데크
우선순위 대기열
나무 모델
이진 트리
AVL 트리
단서 이진 트리
레드 블랙 트리
퍼지는 나무
해시 모델
해시 함수
선형 검출 방법
제곱 검출 방법
이중 해시
해시 함수 방법
직접 주소 지정 방법
디지털 분석
정사각형-중간 방법
접는 방법
나누기 남기기법
난수법
갈등을 처리하는 방법
선형 조사 후 해싱
제곱 프로빙 및 해싱
힙 모델
왼쪽 더미
비뚤어진 더미
알고리즘 실습
정렬 알고리즘
삽입 정렬
힐소트
힙 정렬
병합 정렬
빠른 정렬
버블정렬
실용적인 알고리즘
그리디 알고리즘
허프만 코딩
대략적인 빈 포장 문제
분할 정복 알고리즘
알고리즘 실행 시간 분할 및 정복
최근 이슈
질문 선택
동적 프로그래밍
재귀 대신 테이블 사용
행렬 곱셈의 순서
최적 이진 검색 트리
모든 점 쌍에 대한 최단 경로
무작위화 알고리즘
난수 생성기
점프 테이블
적성검사
마이크로서비스 솔루션 데이터 구조 모델
등록 센터 클러스터 알고리즘
Nacos 클러스터 선거 Raft 알고리즘
전염병 확산 알고리즘 P2P-Gossip 프로토콜
유레카 메시지 브로드캐스트 일관성 프로토콜
분산 트랜잭션 일관성 프로토콜
강력한 일관성 프로토콜
약한 일관성 프로토콜
최종 일관성 프로토콜
사육사 합의 프로토콜 알고리즘
ZAB 원자 방송 프로토콜
Paxos 합의 프로토콜
분산 캐시 제거 알고리즘
LRU(최근에 덜 사용됨) 캐시 제거 알고리즘
LFU(가장 덜 자주 사용되는 알고리즘) 캐시 제거 알고리즘
ARC(Adaptive Cache replacement Algorithm) 캐시 제거 알고리즘
FIFO(선입 선출) 캐시 제거 알고리즘
MRU(가장 최근에 사용됨) 캐시 제거 알고리즘
분산 캐시 분석 프로토콜
블룸 필터
뻐꾸기 필터
로드 밸런싱 알고리즘
폴링 메커니즘 알고리즘
무작위 알고리즘
고정 IP 알고리즘
가중치 알고리즘
마이크로서비스 전류 제한 알고리즘
카운터(고정 창) 알고리즘
슬라이딩 윈도우 알고리즘
누출 버킷 알고리즘
토큰 버킷 알고리즘
분산 컴퓨팅 작업 스케줄링 알고리즘(xxl-job)
회전 방법
가중치 방식
해싱
최소 조인 방법
최소 누락 방법
가장 빠른 응답 방법
유전자 알고리즘
개미군집 알고리즘 솔루션
분산 데이터 동기화 및 일관성 프로토콜
MySQL
반동기 복제
비동기식 복제
글로벌 동기화
은닉처
운하
수달
(openresty/tengine) 실제 높은 동시성
네이티브 Nginx 코어 모듈
Nginx 모듈 유형
표준 HTTP 모듈
선택적 HTTP 모듈
타사 모듈(lua)
Nginx 이벤트 중심 모델 및 기능
Nginx 코어 구성
가상 호스트 구성
상류
위치
정적 디렉터리 구성
https 프로토콜 구성
Nginx 로드 밸런싱 알고리즘 구성
폴링 메커니즘 알고리즘
무작위 알고리즘
고정 IP 알고리즘
가중치 알고리즘
오픈레스티/tengine
Openresty는 Lua와 결합하여 10억 수준의 제품 세부 정보 페이지를 구현합니다.
Tengine은 Alibaba에서 개발한 웹 서버 프로젝트입니다.
JVM 가상머신의 실질적인 성능 튜닝
프로그래밍 언어 개발 역사
어셈블리 언어/기계어
C/C 언어
자바/php/쉬운 언어/ython
JVM 클래스 로더ClassLoader
HotSpot 가상 머신(C) 소스 코드를 통한 클래스 로더 구현 원리 분석
클래스 로더란 무엇입니까?
클래스 파일을 메모리로 읽어 들입니다.
클래스 로더 분류
부트스트랩 클래스 로더(C로 작성됨)
$JAVA_HOME/jre/lib
확장 클래스 로더(Java로 작성됨)
JAVA_HOME/jre/lib/ext
(애플리케이션) AppClassLoader 클래스 로더(Java로 작성)
클래스 경로 아래의 클래스 및 jar 패키지
사용자 정의 클래스 로더(Java로 작성됨)
사용자 정의 클래스 파일 디렉터리
부모 위임 메커니즘의 이점
개발자가 정의한 클래스와 jdk에서 정의한 소스 코드 클래스 간의 충돌을 방지하고 메모리 내에서 클래스의 고유성을 보장하기 위한 것입니다.
클래스 로더 상위 위임 원칙 및 이를 위반하는 방법
스파이 메커니즘
스타트업 클래스/확장/애플리케이션 클래스 로더 심층 소스코드 분석
Java SPIService 공급자 인터페이스 원칙
Tomcat/Jetty 클래스 로더 구현 원리
클래스 로더를 사용자 정의하여 바이트 코드 및 직접 작성한 핫 배포 플러그인을 로드하는 방법
로컬 디스크
네트워크 획득
데이터 베이스
동적 프록시 생성
전쟁/항아리
JVM 메모리 구조 원리 분석
JVM 런타임 영역
프로그램 카운터
다음 CPU 컨텍스트 전환을 통해 실행을 재개할 수 있도록 현재 스레드 실행 코드의 줄 번호를 기록합니다.
더미
새 개체는 힙에 저장됩니다(스레드에서 공유).
프로덕션 환경에서 힙 메모리 누수 문제 해결
메모리 누수
힙 메모리 누수란 무엇입니까?
힙 메모리 응용 공간, GC는 메모리를 해제할 수 없습니다.
메모리 누수가 발생하는 시나리오
스레드 로컬 메모리 누수
hashMap 사용자 정의 키 객체 메모리 누수
프로덕션 환경에서 힙 메모리 누수 문제 해결
Jps/Jmap
Jvisualvm/jconsole
메모리 오버플로
힙 메모리 오버플로란 무엇입니까?
힙 메모리 공간 신청시 공간이 부족합니다.
힙 메모리 오버플로
데이터베이스에서 한 번에 너무 많은 데이터를 가져오는 등 메모리에 로드되는 데이터의 양이 너무 많습니다.
컬렉션 클래스에 객체에 대한 참조가 있는데, 사용 후에도 지워지지 않아 JVM이 이를 재활용할 수 없습니다.
코드에 무한 루프가 있거나 루프가 너무 많은 중복 개체 엔터티를 생성합니다.
시작 매개변수 메모리 값이 힙 메모리를 너무 작게 설정합니다.
메모리 오버플로 솔루션
힙 메모리 늘리기
힙 메모리 구조 세부정보
힙 구조 분할
신세대/구세대
새로운 세대
새로 생성된 객체는 새로운 세대에 저장됩니다.
노년
자주 사용되는 객체는 Old Generation에 저장됩니다.
JDK 버전
jdk1.7
eden(에덴동산) (s0)에서 (s1) 영구 생성(방법 영역)
jdk1.8
(s0)에서 (s1)까지의 eden (Eden of Eden) 영구 생성 (메타 공간)
특성:
신세대와 구세대의 기본 비율은 1:2입니다.
-XX:새 비율
s0/s1 8:1:1의 기본 Eden
-XX:생존자 비율
일반적인 단어
YoungGen(신세대)
oldGen (구세대)
s0(부터)
s1(에)
PermGen(영구 세대)
메타스페이스
GC의 분류
부분 수집
차세대 컬렉션(Minor GC/Young GC)
이전 세대 컬렉션(Major GC/Old GC)
CMS GC는 이전 세대를 별도로 수집합니다.
힙 및 메서드 영역 수집
(Full GC): 전체 Java 힙 및 메소드 영역(메타 공간)에 대한 가비지 컬렉션을 수집합니다.
일반적인 면접 질문
Full gc와 Minor GC/Young GC의 차이점
Full GC는 신세대 및 구세대 수집을 트리거합니다.
마이너 GC가 차세대 GC 수집을 트리거합니다.
마이너 GC 수집 시간이 매우 빈번함
Full gc는 이전 세대 또는 메소드 영역(메타공간)에 메모리가 부족할 때 재활용을 트리거합니다.
Full GC의 GC 복구 효율은 매우 낮습니다.
전체 GC 재활용을 실행하지 마세요.
대형 개체는 어디에 저장되나요?
에덴 영역을 저장할 수 없는 경우에는 Old Generation에 직접 저장됩니다.
GC 로그 분석
기억탈출
공간 보장
스레드 스택 및 스택 프레임의 내부 구조 분석
지역변수 테이블
피연산자 스택
동적 연결
메소드 내보내기
로컬 메소드 스택(JNI 호출 C 코드) 기술
문자열 상수 풀
상수 풀 분류
정적 상수 풀
상수 풀 실행
문자열 상수 풀
다양한 JDK 버전 저장 영역에 대한 상수 풀
JDK1.6 이하의 문자열 상수 풀은 메소드 영역(영구 생성)에 저장됩니다.
JDK1.7에서는 문자열 상수 풀이 힙에 저장되기 시작합니다.
JDK1.8의 문자열 상수 풀은 힙에 저장됩니다.
일반적인 문자열 인터뷰 질문
JDK1.7이 문자열 상수 풀을 힙에 저장하기 시작한 이유는 무엇입니까?
JDK7에서는 문자열 상수 풀이 힙 공간에 배치됩니다. 영구 세대의 재활용 효율성이 매우 낮기 때문에 영구 세대의 가비지 수집은 Full GC 중에만 수행되며, Old 세대에 공간이 부족하고 영구 세대가 부족할 경우 Full GC가 실행됩니다. .
이로 인해 문자열 상수 풀의 재활용 효율성이 낮아집니다. 우리의 개발에서는 많은 수의 문자열이 생성되며 재활용 효율성이 낮아 영구 생성 메모리가 부족합니다. 힙에 넣으면 시간이 지나면 메모리를 회수할 수 있습니다.
문자열 s1 = "mayikt";
String s1 = "mayikt" s1은 문자열 상수 풀을 가리킵니다.
new String("mayikt");
힙에 힙 공간 주소를 생성하고 이를 s2에 반환합니다. s2는 힙 메모리 주소를 얻고 mayikt는 String 클래스에 문자열 상수 풀을 도입합니다.
JVM 객체 메모리 레이아웃
개체 레이아웃
객체 헤더
인스턴스 데이터
패딩 정렬
새 객체는 몇 바이트를 차지합니까?
객체 액세스 위치
핸들 모드
메모리 조각은 핸들 풀로 Java 힙으로 분할될 수 있습니다. 로컬 변수의 참조에 저장되는 것은 객체의 핸들 주소입니다.
직접 포인터 방식
참조에 저장되는 것은 바로 객체 주소입니다.
객체가 생성되는 방법
1. 새로운 객체
2. 반사를 사용하여 객체 만들기
3. clone()을 사용하여 객체를 복제합니다.
4. 역직렬화된 객체 사용
5. 타사 라이브러리 Objenesls가 객체를 생성합니다.
객체 세부정보 생성
1. 객체의 클래스가 로드, 구문 분석 및 초기화되었는지 확인합니다.
1. JVM(Java Virtual Machine)이 바이트코드 새 명령어를 발견하면 먼저 이 명령어의 매개변수가 상수 풀(메타공간)에서 클래스의 기호 참조를 찾을 수 있는지 확인하고 이 기호 참조가 나타내는 클래스를 확인합니다. 로드, 구문 분석 및 초기화되었는지 여부(클래스가 메타스페이스에 의해 로드되었는지 확인하기 위해)
그렇지 않은 경우 해당 클래스 로딩 프로세스를 먼저 실행해야 합니다(그런 다음 상위 위임 메커니즘을 사용하여 클래스(클래스의 전체 경로)를 찾고, 찾을 수 없으면 ClassNotFoundException 오류가 보고됩니다).
2. 클래스 로딩 확인이 통과되면 가상 머신은 새 객체에 메모리를 할당합니다.
힙 메모리가 규칙적인 경우 사용
포인터 충돌
힙 메모리가 불규칙한 경우 사용
무료 목록
3. 가상 머신에서는 객체 생성이 매우 자주 발생합니다. 포인터가 가리키는 위치만 수정하더라도 동시 상황에서는 스레드로부터 안전하지 않습니다.
1. CAS 실패 재시도를 사용하여 업데이트의 원자성을 보장합니다.
2. 각 스레드에 대해 Eden(Eden Campus)의 현재 스레드에 고유한 TLAB 공간을 할당합니다.
4. 메모리 할당이 완료된 후 가상 머신은 할당된 메모리 공간(객체 헤더 제외)을 0으로 초기화해야 합니다. TLAB를 사용하는 경우 이 작업도 미리 할당할 수 있습니다. 그런데 TLAB에. 이 작업을 통해 객체의 인스턴스 필드를 초기 값을 할당하지 않고 Java 코드에서 직접 사용할 수 있으므로 프로그램은 이러한 필드의 데이터 유형에 해당하는 0 값에 액세스할 수 있습니다.
5. 객체 헤더 정보 설정 JVM(Java Virtual Machine)은 객체가 인스턴스인 클래스, 클래스의 메타데이터 정보를 찾는 방법, 객체의 해시 코드 등 객체에 필요한 설정도 수행해야 합니다. (실제로 객체의 해시 코드는 Object::hashCode() 메서드가 실제로 호출될 때까지 지연됩니다.) 객체의 GC 생성 연령 및 기타 정보입니다. 이 정보는 개체의 개체 헤더(Object Header)에 저장됩니다. 바이어스 잠금 활성화 여부 등 가상 머신의 현재 실행 상태에 따라 개체 헤더가 다른 방식으로 설정됩니다.
6. 초기화를 위한 init 메소드 실행
JVM 가비지 수집 알고리즘
가비지 수집 알고리즘
마크 앤 스윕 알고리즘
장점: 고효율/이동하는 메모리 주소 없음
단점: 조각화되기 쉽다
태그 정렬 알고리즘
장점: 조각화 문제 방지
단점: 메모리 주소 이동, 낮은 효율성
표시 복사 알고리즘
장점: 조각화 문제 방지
단점: 메모리 주소 이동, 고효율
세대 알고리즘의 원리
새로운 세대
노년
JDK1.0-14 수집기
가비지 컬렉터 조합
(신세대 병렬) ParNew (구세대 직렬) Serial old
(신세대 시리얼) 시리얼, (구세대) 시리얼 Old
(신세대 시리얼) 시리얼/CMS (구세대 동시성)
(JDK9는 더 이상 사용되지 않음)
(신세대 동시성) ParNew/CMS (구세대 동시성)
(JDK9에는 권장되지 않음)
(신세대 병렬) Parallel/SerialOld (구세대 직렬)
권장되지 않음
(신세대 병렬) Parallel Scavenge/Parallel Old (구세대 병렬)
JDK8 기본값
G1(JDK9 기본) 전체 힙 수집
JDK8 기본값
직렬(단일 GC 스레드 재활용)
직렬 가비지 수집기에 대한 자세한 설명
콤비네이션
차세대(직렬) 표시 복제 알고리즘
직렬 오래된 마크 압축 알고리즘
애플리케이션 시나리오
단일 코어 CPU 및 작은 메모리 사용
병렬(다중 GC 스레드 재활용)
ParNew 가비지 컬렉터에 대한 자세한 설명
애플리케이션 시나리오
새로운 세대
멀티 코어 CPU에 적합
콤비네이션
(Old Generation) Serial old(마크 압축 알고리즘)
(구세대) CMS(마크 앤 스윕 알고리즘)
병렬 가비지 수집기에 대한 자세한 설명
애플리케이션 시나리오
신세대/구세대 다중 GC 동시 수집
콤비네이션
평행한
병렬 oldGC
동시성(GC 및 사용자 스레드가 동시에 실행됨)
CMS 가비지 수집기 원리(핵심 사항)
구현원리
초기 표시
동시 마킹
라벨을 다시 붙이다
동시 클리어
CMS 컬렉터의 단점은 무엇입니까?
표시 및 청소 알고리즘으로 인해 조각화 문제 발생
대체 SerialOld는 비효율적입니다.
증분 업데이트 방식에 따른 라벨 누락 문제 해결
G1 컬렉터 원리(핵심사항)
구현원리
n 여러 다른 지역
지역 메모리 세트(Remember Set)
카드테이블에 대한 자세한 설명
원본 스냅샷(satb)을 기반으로 건물 표시 문제 해결
ZGC 가비지 수집기에 대한 자세한 설명
Epsilon 및 Shenandoah 가비지 수집기에 대한 자세한 설명
가비지 복사 알고리즘
가비지 수집 메커니즘의 3색 표시 알고리즘 원리
3색 마킹 알고리즘으로 인한 다중 라벨링/라벨 누락 문제
떠다니는 쓰레기
입찰 누락 문제
개체 누락 라벨 솔루션
증분 업데이트 방식(CMS) 기반
원래 스냅샷 방식 satb(G1) 기반
지역 메모리 세트(Remember Set)와 카드 테이블(Cardtable)에 대한 자세한 설명
세상을 멈춰라
Stop the World 문제는 왜 발생하는가?
세계 정지 문제를 피하는 방법
JVM 튜닝 도구에 대한 자세한 설명
JDK 자체 Jstat, Jinfo, Jmap, Jhat 및 Jstack 튜닝 명령에 대한 자세한 설명
Jvisualvm 및 Jconsole 튜닝 도구에 대한 자세한 설명
Alibaba 도구 arthas 사용에 대한 자세한 설명
GC 로그 분석 도구
GC 로그 세부정보를 읽는 방법
GCEasy 로그 분석 도구 사용
GCViewer 로그 분석 도구 사용
JVM 매개변수 튜닝 실습
1억 레벨 트래픽 프로젝트 힙 메모리 신세대 및 구세대 가비지 수집 매개변수 설정 및 튜닝
온라인 생산 환경 OMM 메모리 오버플로 모니터링 도구 및 포지셔닝 솔루션
직접적인 시스템 정지를 초래하는 온라인 프로덕션 환경에서 심각한 Full GC를 줄이는 방법에 대한 최적화 사례
높은 동시성 시스템, 온라인 프로덕션 환경에서 잦은 GC 작업을 피하는 방법
높은 동시성 시스템, G1/CMS 수집기 최적화 방법
일일 평균 백만 PV 서비스에 대한 JVM 힙의 초기 메모리 크기를 설정하는 방법
실제 동시 프로그래밍
운영 체제 기본 사항
사용자 모드와 커널 모드 간 전환 프로세스
Linux 프로세스 모델 관리
Linux 프로세스 간 통신 원리
Linux 네트워크 통신 원리
멀티스레딩 기본 사항
멀티스레딩으로 빠른 시작
프로세스/스레드란 무엇인가
프로세스는 자원 할당의 가장 작은 단위입니다.
스레드는 프로그램 실행의 가장 작은 단위입니다.
다중 스레드 애플리케이션 시나리오
클라이언트(모바일 앱/) 개발
비동기식으로 SMS 보내기/이메일 보내기
실행하는 데 시간이 걸리는 코드를 멀티스레드 비동기 실행으로 변경합니다.
비동기적으로 로그 쓰기
멀티스레드 다운로드
멀티스레딩과 단일 스레딩의 차이점
멀티스레딩(병렬 실행)
단일 스레드(동기 실행)
멀티스레드 CPU 스위칭의 개념을 이해하는 방법
현재 CPU는 다른 스레드를 실행하도록 전환됩니다.
멀티스레딩을 많이 활성화할수록 좋다는 말이 사실인가요?
반드시 그런 것은 아닙니다. 너무 많은 스레드를 열면 쉽게 CPU 컨텍스트 전환이 발생할 수 있습니다.
사용자 스레드와 데몬 스레드의 차이점
스레드를 정상적으로 중지하는 방법
멀티스레딩의 7가지 상태 분석
초기 상태
준비 상태
운영상태
<fontface="宋体"><span style="font-size: 14px;">사망 상태</span></font><br>
차단 상태
시간 초과 대기
대기 상태
멀티스레딩을 만드는 다섯 가지 방법
Thread 클래스를 상속받아 스레드 생성
스레드를 생성하기 위한 Runnable 인터페이스 구현
Callable 및 Future를 사용하여 스레드 생성
Executor 프레임워크와 같은 스레드 풀 사용
@Async 비동기 주석을 사용하여 스레드 만들기
람다 표현식을 사용하여 스레드 만들기
멀티스레드 스레드 안전성
스레드 안전 문제란 무엇입니까?
여러 스레드가 동시에 동일한 전역 변수에 쓰면 다른 스레드의 방해를<br>받아 스레드 안전 문제가 발생할 수 있습니다.
잠금과 동기화 잠금의 차이점
잠금 수동으로 잠금 획득 및 해제
동기화는 자동으로 잠금을 획득하고 해제합니다.
동기화된JDK6은 자동 잠금 업그레이드 프로세스를 시작합니다.
잠금 잠금의 기본 구현은 aqs 잠금을 기반으로 하며 잠금을 수동으로 업그레이드해야 합니다.
다중 스레드 교착 상태 문제
멀티스레딩으로 교착 상태를 해결하는 방법
jconsole.exe는 교착 상태를 진단합니다.
다중 스레드 교착 상태 스레드의 원인
동기화 내 중첩된 동기화
스레드 안전성 문제를 해결하는 방법(스레드 동기화를 보장하는 방법)
동기화는 스레드 안전 문제를 해결합니다.
동기화된 동기화 코드가 빠릅니다.
동기화되고 수정된 인스턴스 방법
동기화되고 수정된 정적 메서드
잠금 잠금은 스레드 안전 문제를 해결합니다.
여러 스레드 간의 통신
기다려서 알림
wait는 현재 잠금을 해제하고 현재 스레드를 차단합니다.
알림은 차단된 스레드를 깨웁니다.
조인방식의 원리
맨 아래 레이어는 대기 캡슐화를 기반으로 합니다.
동기화 원리
객체가 구성되는 방식
객체 헤더
마크 워드
해시 코드(HashCode), GC 생성 기간, 잠금 상태 플래그, 스레드가 보유한 잠금, 편향된 스레드 ID, 편향된 타임스탬프
클래스 포인터<br>
인스턴스 데이터
구성원 속성
패딩 정렬
객체의 크기는 8바이트의 정수 배수여야 합니다. 8바이트의 정수 배수가 아닌 경우 정렬되고 채워집니다.
동기화된 잠금 업그레이드 프로세스
바이어스 잠금
잠금 및 잠금 해제에는 추가 오버헤드가 필요하지 않습니다. 이는 추가 오버헤드 없이 동일한 스레드가 동기화된 코드 블록에 액세스하는 데에만 적합합니다. 여러 스레드가 동시에 경쟁하면 잠금이 취소됩니다.
경량 잠금장치
경쟁 스레드는 차단되지 않으므로 잠금에 대한 경쟁 스레드가 확보되지 않으면 스핀이 CPU 리소스를 소비하는 데 사용됩니다. Spin(jdk1 .Intelligent. 7 이후 회전)
체중 고정
스레드 경쟁은 스핀을 사용하지 않고, CPU 리소스를 소모하지 않으며, 상대적으로 오랜 시간 동안 동기 코드 실행에 적합합니다.
동기화된 잠금 확장 프로세스의 원리 분석
바이어스 잠금(101)
1. 현재 스레드는 객체 헤더의 마크워드에서 편향된 잠금인지 여부를 얻습니다. 편향된 잠금인 경우 스레드의 ID=== 현재 스레드 ID인지 확인합니다.
2. 현재 스레드 ID와 동일하면 CAS 작업이 반복적으로 수행되지 않고 동기화 코드 블록에 직접 입력됩니다.
3. 현재 스레드 ID와 같지 않은 경우, lock-free 상황이고 나와 경쟁하는 다른 스레드가 없으면 직접 CAS를 사용하여 markword의 잠금 상태를 101로 수정하고 현재 스레드 ID도 저장합니다. 마크워드에서
4. 다른 스레드는 바이어스 잠금 스레드와 경쟁하기 시작합니다. 바이어스 잠금 취소 횟수가 20에 도달하면 일괄적으로 바이어스 잠금을 T2 스레드로 직접 리디렉션합니다(참고: t2와 경쟁하는 다른 스레드가 없습니다). 바이어스 잠금 취소 횟수가 20, 40회에 도달하면 나중에 일괄 실행 취소가 시작됩니다.
5. 편향된 잠금을 취소하려면 편향된 잠금 스레드를 전역 안전 지점에서 중지하고 마크워드를 경량 잠금으로 수정한 다음 편향된 잠금 스레드를 깨워야 합니다.
6. 참고: JDK15는 기본적으로 편향된 잠금 최적화를 끕니다.
경량자물쇠(000)
1. 여러 스레드가 동시에 동일한 잠금을 위해 경쟁하는 경우 경량 잠금을 업그레이드하고 CAS를 사용합니다(markword 잠금 상태 = 00 수정). 성공하면 markword로 바꾸고 현재 스택 프레임에 직접 HashCode 값을 저장합니다. , 잠금 기록 주소는 마크워드에 저장됩니다.
2. 경량 잠금을 사용하여 잠금을 해제하면 마크워드 값 내용이 복원됩니다.
헤비웨이트(010)(C 모니터)
1. 스레드가 여러 번 재시도했지만 여전히 잠금을 획득하지 못한 경우 현재 잠금은 중량 잠금으로 업그레이드됩니다.
2.2. 잠금을 획득하지 못한 스레드는 C 모니터 개체 EntryList 컬렉션에 저장됩니다. 동시에 현재 스레드는 CPU 실행 권한을 직접 차단하고 해제하여 경쟁에 참여합니다. CPU 컨텍스트 전환이 발생해야 하기 때문에 이후 기간의 잠금은 매우 높습니다. 사용자 모드에서 커널로 전환하고 개체 헤더의 마크워드 값을 C 모니터로 변경합니다. 메모리 주소 포인터 Java 개체는 C 모니터와 연결됩니다.
C 모니터 모니터 잠금 장치(헤비웨이트 잠금 장치)
모니터(객체 중량 잠금 장치)
recursions(재귀 횟수/재진입 횟수)
소유자(현재 잠금을 보유하고 있는 스레드 ID를 기록합니다)
waitSet(풀이 대기 상태가 되기를 기다리는 스레드는 _WaitSet에 추가됩니다)
EntryList(잠금 풀: 잠금 블록 상태를 기다리는 스레드가 목록에 추가됩니다)
대기 풀의 스레드가 깨어나면 즉시 잠금을 획득합니까?
대기 풀의 스레드가 활성화된 후 대기 풀은 잠금 풀로 전송되어 다시 잠금 경쟁을 위해 대기합니다.
잠금 조대화, 제거 및 성능 최적화
자물쇠 거칠기
각 스레드는 가능한 한 짧은 시간 동안 잠금을 유지합니다.
잠금 제거
잠금 제거는 컴파일러 수준에서 발생하는 잠금 최적화 방법입니다.
변동성 키워드 원칙
키워드 속성
가시성 확보
재정렬 비활성화
원자성을 보장하지 않음
자바 메모리 모델
CPU 멀티코어 하드웨어 아키텍처 분석
jmm 8개 동기화 사양
휘발성 캐시 일관성 프로토콜
버스 자물쇠
MESI 프로토콜
허위 공유 문제
캐시 라인의 기본 개념
은행 채우기 계획
재정렬/메모리 배리어/이중 확인 잠금에 휘발성을 추가해야 하는 이유는 무엇입니까?
동기화와 휘발성의 차이점
Volatile이 원자성을 보장하지 않는 이유
동시 잠금 분류
비관적인 자물쇠
낙관적 잠금
스핀 잠금
재진입 잠금
공정한 자물쇠
부당한 잠금
aqs 소스 코드 해석
LockSupport 소스 코드 해석
AbstractQueuedSynchronizer 소스 코드 해석
ReentrantLock/ReentrantReadWriteLock, ReadWriteLock 소스 코드 해석
Semaphore/CountDownLatch/CyclicBarrie 소스 코드 해석
AQS의 하위 레이어를 구현하는 방법
A.Cas는 AQS의 스레드 안전성을 보장합니다.
B. 이중 연결 목록은 차단된 스레드를 저장합니다.
C.LockSupport는 스레드를 차단하고 깨웁니다.
핵심 속성
상태 상태 값
노드 상태(waitStatus)
-2 현재 스레드가 잠금을 차단하고 동시에 잠금을 해제합니다.
-1은 후속 노드의 스레드를 깨웁니다<br>
AQS 애플리케이션 시나리오
잠금 잠금의 기본 구현
공정한 잠금과 불공정한 잠금
기본값은 불공정 잠금입니다.
경합 잠금 시간
공정한 잠금: 잠금을 놓고 경쟁할 때 다른 스레드가 이미 잠금을 보유하고 있는 경우 이중 연결 목록의 끝에 직접 저장됩니다.
불공정한 잠금: 잠금을 놓고 경쟁할 때 다른 스레드가 이미 잠금을 보유하고 있으면 CAS가 다시 시도됩니다.
핵심 디자인 원칙
잠금 방법()
CAS를 사용하여 AQS 클래스의 상태 값을 0에서 1로 수정합니다.
변경이 성공한 경우(잠금 획득 성공)
변경에 실패한 경우(잠금 획득 실패)
AQS 이중 연결 리스트에 저장됨
잠금 해제 방법()
CAS를 사용하여 AQS 클래스의 상태를 0에서 1로 수정합니다.
CAS가 성공하면
AQS 이중 연결 목록에서 헤드 노드의 다음 노드에 의해 캐시된 스레드를 깨워야 합니다.
질문: 잠금 해제가 잠금을 해제하고 여러 스레드 대신 하나의 스레드만 깨우는 이유는 무엇입니까?
맨 아래 계층은 차단된 스레드를 저장하기 위해 양방향 연결 목록을 사용합니다. 모든 스레드를 깨우는 데 드는 비용은 매우 높습니다.
잠금에는 잠금 업그레이드 프로세스가 없으며 개발자가 직접 확장해야 합니다.
ConcurrentHashMap1.7 소스 코드 기본 잠금
상태
참고: 조건과 잠금은 동일한 이중 연결 목록을 사용하지 않습니다.
풀 잠금 및 대기 풀
잠금 풀: 잠금 경쟁에 실패한 잠금의 스레드를 나타내며 AQS 이중 연결 목록에 저장됩니다.
대기 풀: 대기 메소드를 호출하고 적극적으로 잠금을 해제(aqs 상태 값 = 0)한 후 대기 풀 이중 연결 리스트에 저장하는 현재 스레드를 참조합니다.
대기 풀에서 스레드를 깨우는 방법은 무엇입니까?
이 signal()을 호출하면 대기 풀의 노드 노드(스레드)만 AQS 이중 연결 목록 잠금 풀로 전송되어 잠금 리소스를 다시 경쟁하게 됩니다.
이 signal()을 호출하고 잠금 해제 메서드를 호출한 후 wake-up 잠금 풀의 스레드는 잠금 리소스를 놓고 경쟁하기 시작합니다.
CountDownLatch(카운터)
생성자를 통해 new CountDownLatch(1)
AQS를 기반으로 하는 기본 구현은 AQS 클래스의 상태 값을 1로 설정합니다.
메소드를 기다리다
AQS 이중 연결 리스트에 현재 스레드 블록을 저장합니다.
카운트다운
AQS 클래스에서 상태 값 -1을 연산하고, AQS 상태가 0으로 변경되면 AQS 클래스에서 이중 연결 리스트에 저장된 스레드를 깨운다.
세마포어(세마포어)
생성자를 통해 new Semaphore(3)
AQS를 기반으로 하는 기본 구현은 AQS 클래스의 상태 값을 3으로 설정합니다.
획득의 기본 작업은 AQS 클래스의 상태 값 -1을 수정하는 것입니다. AQS 클래스의 상태 값이 0으로 변경되면 현재 스레드를 차단하고 AQS 클래스의 이중 연결 목록에 저장해야 합니다.
릴리스의 최하위 계층은 AQS 클래스의 상태 1에서 작동합니다.<br>
AQS 클래스에서 차단된 스레드를 동시에 깨우기(한 스레드만 깨우기)
CyclicBarrier(동기화 장벽)
생성자 new CyclicBarrier(2)를 통해<br>
하단 레이어는 CyclicBarrier 개수 속성에 값 = 2를 할당합니다.
통화 대기 하위 레이어
CyclicBarrier count-1에 대한 작업
개수=0
실행을 계속하고 대기 중인 풀의 모든 스레드를 깨웁니다.
카운트!=0
대기 풀에 저장됨
동시 원자 작업
원자 클래스
CAS(낙관적 잠금) 원리
Unsafe 매직 클래스에 대한 자세한 설명
차단 대기열BlockingQueue 원칙
차단 대기열 분류
ArrayBlockingQueue 배열 제한 큐
ConcurrentLinkedQueue 연결 목록 제한된 큐
PriorityBlockingQueue 우선순위 정렬 무제한 큐
DelayQueue 지연 무제한 큐
프레임워크 적용
BlockingQueue 기반의 필기 스레드 풀
BlockingQueue 기반의 필기 메시지 미들웨어
BlockingQueue 기반의 필기 로그 프레임워크
Executor 스레드 풀 상세 설명 및 핵심 소스코드 분석
스레드 풀을 사용하는 이유
재사용 성
통합관리
대응 개선
스레드 풀을 만드는 네 가지 방법
newCachedThreadPool(); 캐시 가능한 스레드 풀
newFixedThreadPool(); 길이를 고정하고 최대 스레드 수를 제한할 수 있습니다.
newScheduledThreadPool()을 예약할 수 있습니다.
newSingleThreadExecutor();
실제 하위 계층은 ThreadPoolExecutor 생성자 캡슐화 스레드 풀을 기반으로 합니다.
스레드 풀의 핵심 원리 분석
LinkedBlockingQueue
생산자와 소비자 모델
Alibaba가 Executor 사용을 권장하지 않는 이유
LinkedBlockingQueue 무제한 큐의 기본 사용은 메모리 오버플로가 발생하기 쉽습니다.
스레드 풀 대기열이 가득 찬 경우 수행할 작업
거부 정책
AbortPolicy는 작업을 삭제하고 런타임 예외를 발생시킵니다.
CallerRunsPolicy 실행 작업
DiscardPolicy 무시, 아무 일도 일어나지 않습니다.
DiscardOldestPolicy는 대기열에서 시작되어 대기열에 먼저 들어갑니다.
RejectedExecutionHandler 인터페이스 구현 및 프로세서 사용자 정의
스레드 풀 매개변수를 올바르게 구성하는 방법
CPU 집약적
최적의 스레드 수 = CPU 코어 수 또는 CPU 코어 수 ±1
강한
최적의 스레드 수 = ((스레드 대기 시간 스레드 CPU 시간)/스레드 CPU 시간) * CPU 수
ThreadPoolExecutor를 기반으로 스레드 풀을 사용자 정의하는 방법
FutureTask 소스 코드 해석
LockSupport를 기반으로 FutureTask 구현
대기/알림을 기반으로 FutureTask 구현
ForkJoin 소스 코드 해석
동시 프로그래밍 개발
일을 훔치는 메커니즘
포크 조인 원리
Threadlocal 소스 코드 해석
스레드로컬이란?
Threadlocal 애플리케이션 시나리오
1.Spring 트랜잭션 템플릿 클래스
2. httprequest 받기
3.Aop 콜 체인은 매개변수를 전달합니다.
Threadlocal과 동기화의 차이점
Threadlocal 메모리 누수를 방지하는 방법
1. 제거 메소드를 호출하십시오.
2. set 메소드를 사용하면 이전 키가 null이라는 것이 지워집니다.
마이크로서비스 프레임워크 소스 코드 해석
SpringBoot 소스 코드 해석
SpringBoot 자동 구성 작동 방식
SpringBoot 코어 모듈 소스 코드 해석
SpringBoot 핵심 주석 소스 코드 해석
SpringBoot 임베디드 서블릿 컨테이너 소스 코드 해석
SpringBoot 패키징 배포 및 운영 및 유지 관리
서블릿 컨테이너가 Webflux를 극복하는 방법
SpringCloudNetfilix(1세대) 핵심 컴포넌트 소스코드 해석
유레카 서비스 등록 및 검색 소스코드 해석
유레카 서비스 리뉴얼(heartbeat)
Eureka 서버측 서비스 제거
유레카 서비스 자체 보호 메커니즘
서비스가 중단되면 어떻게 되나요?
로컬 서비스는 재시도 메커니즘을 사용합니다.
로컬 서비스가 주소 장애 조치를 구현합니다.
유레카 서비스 오프라인 알림
유레카 클러스터 데이터 동기화
Fegin 선언적 서비스 호출 소스 코드 해석
Hystrix는 서비스 전류 제한, 다운그레이드 및 회로 차단기 소스 코드 해석을 구현합니다.
Zuul 통합 게이트웨이, 서비스 라우팅, 필터 소스 코드 해석에 대한 자세한 설명
구성 분산 구성 센터 소스 코드 해석
Sleuth 분산 링크 추적 소스 코드 해석
리본 클라이언트 로드 밸런싱 상세 설명 및 소스코드 분석
SpringCloudAlibaba(2세대) 소스 코드 해석
나코스 분산등록센터 소스코드 해석
서비스 등록 및 검색
Nacos 서비스 등록 및 검색 소스코드 해석
서비스 등록 원칙
유레카클라이언트
JerseyClient를 사용하여 등록 요청 보내기
유레카서버 측
ConcurrentHashMap을 사용하여 인터페이스 주소 캐시
키는 서비스 이름입니다
값은 캐시 인터페이스 주소입니다.
Naocs 서비스 하트비트 감지 및 갱신 소스 코드 해석
기본적으로 EurekaClient는 30초마다 하트비트 갱신 패키지를 보내 시간을 연장하고 EurekaServer에 내가 아직 살아 있음을 알립니다.
기본적으로 EurekaServer 측은 60초마다 캐시 주소에서 만료된 주소를 검색하여 새 컬렉션에 저장하고 무작위 알고리즘을 사용하여 삭제합니다.
Naocs 서비스 오프라인 및 헬스체크 소스코드 해석
Nacos 클러스터 Raft 선거 알고리즘 소스 코드 해석
Nacos 서버 긴 폴링 처리 메커니즘
Nacos 클러스터 노드 간의 데이터 동기화 원리
Nacos의 AP 모드 소스 코드 해석
Nacos의 CP 모드 소스 코드 해석
Nacos 클러스터 분할 브레인 솔루션
분산 구성 센터
Nacos 분산 구성 센터의 구현 원리
Nacos에서 구성 파일을 동적으로 새로 고치는 방법
게이트웨이 차세대 마이크로서비스 게이트웨이 소스 코드 해석
Gateway 성능이 Zuul 성능보다 나은 이유는 무엇입니까?
게이트웨이 동적 라우팅 소스 코드 분석
시간 규칙 일치 경로 지정
쿠키 일치 경로
헤더 일치 경로
호스트 일치 경로
요청 방법 일치 경로
요청 경로 일치 경로
게이트웨이 필터 소스 코드 분석
사용자 정의 게이트웨이 필터
게이트웨이는 Nacos를 통합하여 로드 밸런싱을 달성합니다.
게이트웨이는 Sentinel을 통합하여 게이트웨이 전류 제한을 구현합니다.
Seata 분산 트랜잭션 프레임워크 소스 코드 해석
분산 트랜잭션을 해결하기 위한 Seata의 세 가지 핵심 구성 요소의 소스 코드 해석
Seata는 undo_log 테이블을 기반으로 sql 문을 역으로 생성하고 소스 코드 해석을 롤백합니다.
Seata 지점 트랜잭션 글로벌 잠금 설계 소스 코드 해석
GlobalTransactionalInterceptor 소스 코드 해석
TM이 원격으로 TC에 연결하여 글로벌 트랜잭션 ID 소스 코드 해석을 얻는 방법
Seata 전면 및 후면 미러 소스 코드 심층 소스 코드 해석
Seata와 LCN 롤백의 차이점은 무엇입니까?
운하 분산 데이터 동기화 프레임워크 소스 코드 해석
운하 전체 아키텍처 소스 코드 해석
MySQL 마스터-슬레이브 복제 원리 아키텍처 분석
Canal이 노드에서 BinLog 파일을 구독하는 척하는 방법
EventParser 및 EventSink의 설계 원칙
운하 증분 구독/소비 설계 원칙
Canal 높은 동시 데이터 동기화 성능 최적화
데이터 간 동기화 대기 시간을 줄이는 방법
데이터 동기화 메시지 시퀀스 일관성을 방지하는 방법
데이터 동기화 손실 문제를 피하는 방법
보초
서비스 격리
전류 제한 알고리즘
토큰 버킷
새는 양동이
세마포어를 기반으로 구현됨 세마포어
고정 계산 창
슬라이딩 기술 창
흐름 제어 규칙
스레드
세마포어를 기반으로 구현됨 세마포어
QPS
토큰 버킷
히스트릭스
흐름 제어 규칙
세마포어 격리
센티넬에서
QPS
토큰 버킷
스레드 풀 격리
결함으로 인해 CPU 리소스가 소모됨
전류 제한 방법
구글 구아바(RateLimiter)
알리바바 센티넬
엔진스
Redis lua는 전류 제한을 구현합니다.
nginx 또는 게이트웨이에서 전류 제한을 수행하는 것이 좋습니다.
컬렉션 프레임워크 소스 코드 해석
해시(해시 함수) 지도 수집 프레임워크 소스 코드 해석
기본 지식
==와 같음의 차이점과 기본 구현
같음을 다시 작성하고 해시코드도 다시 작성하는 이유
2진수 및 10진수 변환/^(배타적 OR 연산)/>>>(부호 없는 오른쪽 시프트)/ &(AND 연산)
낮은 수준 구현
JDK1.7
배열 연결 리스트
헤드 삽입 방식(동시 확장 무한 루프 문제)
코드 작성은 간단하다
JDK1.8
배열 연결 리스트 레드 블랙 트리
꼬리 삽입 방법
고급 코드 작성
레드-블랙 트리 변환
(배열 용량 >= 64 & 연결 목록 길이가 8보다 큼)
레드-블랙 트리 노드 수 <6 변환 연결 목록
해시 함수 계산
(h = key.hashCode()) ^ (h >>> 16)
i = (n - 1) & 해시
시간 복잡도
키가 충돌하지 않습니다.
시간 복잡도는 O(1)입니다.
주요 충돌
연결리스트 저장은 O(N)
레드-블랙 트리 저장은 O(LogN)입니다.
해시코드 충돌 문제
해시코드 값은 동일하지만 콘텐츠 값이 다릅니다.
특징:
배열의 0 위치를 저장하는 키는 null입니다.
단방향 연결리스트를 사용하여 구현
순서가 지정되지 않은 해시 저장소
성능 최적화
HashMap으로 메모리 누수 문제를 방지하는 방법
HashMap이 해시 충돌 가능성을 줄이는 방법
HashMap에서 컬렉션의 초기 값 크기를 합리적으로 지정하는 방법
HashMap 일반적인 면접 질문
Equals를 다시 작성할 때 HashCode 메서드를 다시 작성해야 하는 이유는 무엇입니까?
HashMap이 메모리 누수 문제를 방지하는 방법
HashMap1.7의 최하위 레이어는 어떻게 구현되나요?
HashMapKey가 null인 경우 어디에 저장되나요?
HashMap1.7의 최하위 레이어는 어떻게 구현되나요?
HashMapKey가 null인 경우 어디에 저장되나요?
HashMap이 해시 충돌 문제를 해결하는 방법
HashMap이 배열 확장 문제를 구현하는 방법
HashMap의 하위 계층은 단일 연결 목록을 사용합니까, 아니면 이중 연결 목록을 사용합니까?
키 기반 HashMap 쿼리의 시간 복잡도
HashMap1.7과 1.8의 차이점은 무엇입니까?
HashMap1.8에서 다중 스레드 확장의 무한 루프 문제를 피하는 방법
HashMap1.8에 레드-블랙 트리를 도입해야 하는 이유는 무엇입니까?
로딩 팩터가 1이 아닌 0.75인 이유는 무엇입니까?
HashMap의 최하위 계층은 Hash 충돌 가능성을 어떻게 줄입니까?
HashMap은 어떻게 10,000개의 키를 가장 효율적으로 저장합니까?
HashMap의 높은 비트와 낮은 비트 및 모듈로 연산의 이점은 무엇입니까?
키를 해시 값으로 사용하지 않고 상위 16비트로 XOR 연산을 수행하는 이유는 무엇입니까?
HashMap에서 해시 함수는 어떻게 구현됩니까?
HashMap의 맨 아래 레이어가 순서대로 저장되어 있나요? <br>
LinkedHashMap 및 TreeMap의 기본 레이어는 어떻게 순서를 지정합니까?
동시성이 높은 상황에서 HashMap을 사용하는 방법
ConcurrentHashMap의 기본 구현 원칙
ConcurrentHashMap 수집 프레임워크 소스 코드 해석
기본 지식
동기화 및 잠금
분할 잠금 개념을 이해하는 방법
CAS 알고리즘 및 휘발성
기본 구현
JDK1.7
데이터 구조
배열 세그먼트 분할 잠금 HashEntry 연결 목록 구현
잠금 구현
잠금 잠금 CAS 낙관적 잠금 UNSAFE 클래스
용량 확장 구현
여러 세그먼트의 동시 확장 지원
Jdk1.8
데이터 구조
노드 배열을 직접 사용하여 데이터 저장
배열 연결 리스트 레드 블랙 트리
잠금 구현
세그먼트 분할 설계 취소
인덱스가 충돌하지 않으며 cas lock을 사용합니다.
인덱스 충돌은 동기화를 사용합니다.
용량 확장 구현
동시 확장 지원
특징: 기본적으로 16개 세그먼트로 나누어진 멀티스레딩, 고효율 지원
특징:
ConcurrentHashMap은 널 키를 지원하지 않습니다.
목록 수집 소스코드 분석
Arraylist 기본 구현
데이터 구조
정렬
시간 복잡도
첨자 쿼리 시간 복잡도 o(1)
확장
확장은 원래의 1.5 배입니다
스레드로부터 안전하지 않음
장점과 단점
추가, 삭제 효율성이 낮아 확장이 필요하지만 쿼리 효율성은 상대적으로 높다.
벡터 기본 구현
데이터 구조
정렬
시간 복잡도
첨자 쿼리 시간 복잡도 o(1)
확장
확장은 원래의 2 배입니다
스레드 안전성
LinkedList 기본 구현
연결된 목록 데이터 구조를 기반으로 첨자 쿼리 시간 복잡도()
데이터 구조
연결리스트
시간 복잡도
첨자 쿼리 시간 복잡도 log2(n) 이진 검색
스레드로부터 안전하지 않음
장점과 단점
추가, 삭제, 수정의 효율성은 높지만 쿼리 효율성은 상대적으로 낮습니다.
분산 아키텍처 솔루션
인터넷 마이크로서비스 멱등성 아키텍처 설계 및 실습
멱등성 디자인이란 무엇입니까? 멱등성 생산 배경
클라이언트 응답 시간 초과
비즈니스 실행 시간이 매우 긴 경우 대신 mq asynchronous를 사용하는 것이 좋습니다.
재시도 정책
서비스 인터페이스의 멱등성 문제의 핵심 원인 해결
데이터베이스 수준
아키텍처 수준에서 멱등원의 원인 분석
게이트웨이 계층
인터페이스 레이어
글로벌 ID를 기반으로 비즈니스 로직이 실행되었는지 사전에 쿼리
DB 레이어
삽입 유형 고유 주석 제약조건
업데이트 유형 낙관적 잠금 메커니즘
전역 ID가 실제로 인터페이스 멱등성을 보장합니까?
반드시 그런 것은 아니지만 데이터베이스 수준을 고려해야 합니다.
RPC 인터페이스의 멱등성을 보장하는 방법
글로벌 ID
잠금 메커니즘(효율성이 낮기 때문에 권장되지 않음)
실제 비즈니스 시나리오를 기반으로 멱등성 디자인 구현
인터넷 분산 잠금 아키텍처 설계 및 실습
분산 잠금을 사용하는 시나리오는 무엇입니까?
예약된 작업 스케줄링의 멱등성을 보장하는 문제
과매도 문제를 방지하기 위한 플래시 판매 보장
분산 잠금의 필수 구현 원리
재시도 전략
매우 빠른 비즈니스 실행에 적합
시간 초과 제어
수명 연장 디자인
삶을 이어갈 때 교착상태 문제를 피하는 방법
성능 최적화
무리 효과를 고려해보세요
고가용성
차단 시간 초과 설정
잠금 세분성 감소
공평
분산 잠금 호환성 테스트 및 복구 설계
분산 잠금 구현 솔루션
Zookeeper는 분산 잠금(CP 모드)을 구현합니다.
주요 아이디어
임시 노드
경로 고유성
감시자 이벤트
특징
CP 모드 사용
이점
뇌 분할 문제에 대한 선천적 해결책(기전의 절반 이상)
더욱 신뢰할 수 있고 안정적입니다.
결점
클러스터 동기화 데이터 효율성이 낮습니다.
낮은 성능
두 가지 구현 방법
동일한 임시 노드를 기반으로 구현
무리효과가 발생할 수 있음
임시 순차 노드를 기반으로 구현됨
무리 문제를 피하십시오
임시 순차 번호 노드
현재 노드가 가장 작은 노드라면 잠금이 성공적으로 획득되었음을 의미합니다.
현재 노드가 가장 작은 노드가 아닌 경우 이전 노드를 구독합니다.
큐레이터 프레임워크 분산 잠금
잠금 받기
임시 순차 번호 매기기 노드를 기반으로 구현
임시 시퀀스 노드를 생성하면 가장 작은 노드가 잠금을 획득합니다.
차단하다
자신이 만든 현재 임시 시퀀스 노드가 가장 작지 않습니다. 이전 노드를 구독하세요.
잠금 해제
임시 일련번호 노드 삭제
면접의 어려움
zk 마스터 노드는 어떻게 다운되고 어떤 영향을 미치나요?
ZK 재선거가 발생하고 전체 ZK 환경을 일시적으로 사용할 수 없습니다.
Zab 프로토콜을 고려해야 합니다.
zxid를 먼저 비교한 다음 myid를 비교하세요.
zk 클라이언트 교착 상태 문제를 피하는 방법
zk서버가 다운됐어요
zk 클라이언트가 차단 시간 초과를 설정함
zk 가동 중지 시간을 모니터링한 후 적극적으로 깨어납니다.
zk 클라이언트가 다운되었습니다
zk의 고유한 특성은 교착 상태 문제를 방지하고 사전에 잠금을 해제합니다.
다른 zk 클라이언트는 차단 시간 초과를 설정했습니다.
잠금을 획득한 jvm은 잠금을 해제하지 않습니다.
수명 연장 횟수를 제어하고 여러 수명 연장 후 적극적으로 잠금을 해제하면 트랜잭션이 롤백됩니다.
Redis는 분산 잠금(AP 모드)을 구현합니다.
주요 아이디어
Setnx는 분산 잠금을 구현합니다.
잠금 받기
동시에 여러 jvm setnx가 실행되면 결국 하나의 jvm만 성공합니다.
잠금 해제
키 삭제
특징
AP 모드 사용
이점
높은 동시성 지원
효율성은 괜찮습니다
비동기식 동기화 데이터 방식 사용
결점
선천적 분할 뇌 문제(Redis 클러스터에는 다수 메커니즘이 없음)
별로 안정적이지 않음
Redis의 선천적인 단일 스레드는 setnx 스레드 안전 문제를 보장할 수 있습니다.
Redisson 프레임워크
잠금 받기
Lua 스크립트를 사용하여 해시 키 만들기
잠금 해제
키 삭제
수명 연장 디자인
기본적으로 감시 스레드는 키 만료를 방지하기 위해 10초마다 활성화됩니다.
면접의 어려움
클라이언트 교착 상태 문제를 방지하는 방법
만료된 키 설정
수명 연장 횟수를 제한하세요.
롤백 트랜잭션
키가 만료되었으나 아직 사업이 실행되지 않았습니다. 어떻게 해야 하나요?
수명 연장 디자인
전역 수명 연장(권장하지 않음)
점진적인 수명 연장(권장)
기본적으로 키 만료를 방지하기 위해 10초마다 미리 수명이 갱신됩니다.
교착 상태 문제로 인해 수명 갱신 횟수를 제한하기 위해 수명을 여러 번 갱신합니다.
롤백 트랜잭션
적극적으로 잠금 해제
Redis 클러스터에서 마스터 노드가 다운되면 어떻게 해야 하나요? <br>
RedLock 빨간색 잠금 알고리즘 사용
Redis 클러스터에서는 마스터와 슬레이브가 구분되지 않습니다.
클라이언트는 여러 Redis 서버에 대한 setnx 요구 사항의 절반 이상을 충족하고 성공적으로 잠금을 획득합니다.
클라이언트가 잠금을 획득하는 데 걸리는 총 시간 > 키 만료 시간을 설정하면 잠금이 자동으로 해제됩니다.
이 알고리즘은 실제로 ZK를 사용하여 분산 잠금을 구현합니다.
인터넷 분산 트랜잭션 아키텍처 설계 및 실습
분산 트랜잭션의 배경
단일 프로젝트 다중 데이터 소스
Jta Atomikos는 분산 트랜잭션을 해결합니다.
RPC 원격 호출 인터페이스
분산 트랜잭션 일관성 프로토콜
강력한 일관성 프로토콜
클러스터에서 각 노드의 복사본 데이터는 일관성이 있어야 합니다.
약한 일관성 프로토콜
클러스터에서 일부 노드 복제본은 일관되지 않은 데이터를 가질 수 있습니다.
최종 일관성 프로토콜
짧은 데이터 지연은 허용되지만 결국 데이터 일관성이 필요합니다.
분산 트랜잭션 설계 아이디어
기본 및 CAP 이론
기본 이론
기본적으로 사용 가능<br>
부드러운 상태
최종 일관성
캡
기초이론
일관성(C)
클러스터에서 각 노드의 복사본 데이터는 일관성이 있어야 합니다.
가용성(A)
클러스터의 일부 노드가 실패한 후에도 전체 클러스터가 여전히 클라이언트의 읽기 및 쓰기 요청에 응답할 수 있습니까?
파티션 허용오차(P)
파티션 내결함성(P)은 주로 불가피한 네트워크 변동으로 인해 발생하는 오류를 나타내며 이 세 가지 모드는 동시에 달성할 수 없으므로 현재는 CP 및 AP 모드의 두 가지 모드만 있습니다.
모드 선택
CP(데이터 일관성 보장)
가용성이 보장되지 않음
Ap(가용성 보장)
그러나 각 복사본의 데이터 일관성은 보장되지 않습니다.<br>
비교 분석
나코스
Nacos는 버전 1.0부터 CP/AP 혼합 모드 클러스터를 지원합니다. 기본적으로 Ap 모드입니다.
유레카
AP 모드
사육사
CP 모드
등록센터에서는 Ap 모드를 권장합니다
유연하고 엄격한 업무
엄격한 거래는 ACID 이론을 충족합니다.
유연한 트랜잭션은 BASE 이론(기본적으로 사용 가능, 최종 일관성)을 충족합니다.
2PC/3PC/TCC<br>
분산 트랜잭션 해결 프레임워크
LCN은 분산 트랜잭션 문제를 해결합니다.
Seata는 분산 트랜잭션 문제를 해결합니다.
MQ는 분산 트랜잭션 문제를 해결합니다.
TCC는 분산 트랜잭션 문제를 해결합니다.
분산 트랜잭션 문제를 해결하기 위해 콜백을 재시도하세요<br>
인터넷 분산 작업 스케줄링 아키텍처 설계 및 실습
기존 예약 작업의 단점
CPU 리소스 소비
비분할은 비즈니스 로직에 영향을 미칩니다
분산 작업 스케줄링의 핵심 설계 아이디어
로그 추적성
유연한 확장 및 축소
병렬 스케줄링 지원
고가용성 전략
실패 처리 전략
동적 샤딩 전략
분산 작업 스케줄링 프레임워크
XXLJob 소스 코드 해석
ElasticJob 소스 코드 해석
mysql 및 Redis 데이터 일관성 프로토콜
해결책
1. mysql 데이터를 업데이트하고 Redis 캐시를 수동으로 삭제합니다.
장점: 낮은 대기 시간
단점: 분리되지 않음
2. mysql 데이터를 업데이트하고 mq 비동기 형식으로 Redis에 데이터를 동기화합니다.
장점: 디커플링 구현, 보상 전략 재시도, 인터페이스 응답 개선
단점: 대기 시간이 길다
3. mq 비동기 형식(운하 프레임워크 구현)과 결합된 MySQLBinLog 구독을 기반으로 Redis에 데이터를 동기화합니다.
장점: 더 많은 디커플링, 재시도 보상 전략, 향상된 인터페이스 응답
단점: 지연 시간이 점점 더 길어지고 있습니다.
핵심 디자인 아이디어
최종 일관성의 개념은 일시적인 데이터 불일치는 허용되지만 최종 데이터는 일관성이 있어야 한다는 것입니다.
이중 쓰기 일관성 프로토콜의 원리
캐시를 먼저 삭제한 후 db를 업데이트하세요(권장하지 않음)
이중 삭제를 연기해야 하고, 두 번 삭제해야 합니다.
처음으로 캐시 삭제
두 번째로 다른 스레드의 동시성을 피하기 위해 더티 읽기 데이터를 Redis에 동기화하므로 몇 초(두 번째 스레드 비즈니스가 이전 데이터를 Redis로 업데이트하는 시간) 동안 지연하여 캐시를 삭제합니다.
먼저 DB를 업데이트한 후 캐시를 삭제하세요.
이는 mq와 결합되어야 하며 메시지 시퀀스 일관성을 보장해야 합니다. 캐시 삭제가 성공해야 합니다.
DoubleWrite 일관성 프로토콜
이중 글쓰기란 무엇인가?
DB를 먼저 업데이트한 후 캐시를 업데이트하세요.
어떤 문제가 생길까
동시 상황에서는 여러 스레드가 동시에 쓰기를 수행하며 다른 스레드는 더티 읽기 데이터를 캐시에 쓸 수 있습니다.
더티 읽기를 해결하는 방법
mysql 트랜잭션 행 잠금 메커니즘을 사용하면 여러 스레드가 동시에 쓰기 작업을 수행하며 결국 하나의 스레드만 행 잠금을 획득합니다. 행 잠금을 획득한 후 Redis는 성공적으로 동기화되어야 행 잠금이 해제될 수 있습니다. 스레드는 쓸 수 있습니다
분산 잠금을 사용하여 구현됨(권장되지 않음, mysql 행 잠금을 기반으로 직접 구현 가능)
운하 프레임 설계 원리
canal은 mysql과 Redis 간의 데이터 동기화 원칙을 해결합니다.
1.canal은 자신을 mysql 슬레이브 노드로 위장하고 mysql 마스터 노드의 binlog 파일을 구독합니다.
2. mysql 마스터 노드의 binlog 파일이 변경되면 binlog 파일이<br> 운하 서버로 전송됩니다.
3. 운하 서버는 binlog 파일을 json 형식으로 변환하여 운하 클라이언트로 보냅니다.
4. 운하 클라이언트는 데이터를 Redis/ES에 동기화합니다.
운하의 동기화 모드
TCP(낮은 효율성)
카프카(권장)
Kafka 데이터 동기화를 통합하여 운하의 효율성을 향상시키는 방법
MQ 주제 모드 통합
단일 주제 및 단일 파티션(전역 binlog 엄격한 순서)
다중 주제 단일 파티션은 테이블 수준 순서를 보장할 수 있습니다.
동일한 테이블 이름이 동일한 파티션에 배치되고 결국 동일한 소비자에 의해 소비됩니다.
해시 모드와 결합된 단일 주제, 다중 주제 다중 파티션
메시지 시퀀스 일관성 문제를 해결하는 방법
여러 파티션을 설정하고 기본 키 ID와 같은 테이블의 필드를 기반으로 해시를 계산합니다. 동일한 ID는 동일한 파티션에 배치되고 동일한 소비자에 의해 사용됩니다.
mysql과 redis 간의 데이터 동기화에 지연이 있습니까?
데이터 동기화 프로세스 중에는 짧은 지연이 발생하며 이는 정상적인 현상입니다. 강력한 일관성을 달성하고 최종 일관성이라는 아이디어를 따르는 것은 어렵습니다.
분산 메시지 미들웨어 원리
MQ 기본 개념 모델
동기식 및 비동기식
트래픽 피크 클리핑
확장성/분리
버퍼링/복구성
생산자와 소비자
MQ 공통 솔루션
MQ가 메시지 축적을 방지하는 방법
소비자 요금 인상(클러스터)
소비자는 일괄적으로 메시지를 받습니다.
MQ는 소비자의 반복적인 소비를 어떻게 방지합니까(멱등성 문제)
Global ID 비즈니스 시나리오는 고유성을 보장합니다.
MQ는 메시지가 손실되지 않도록 어떻게 보장합니까?
메시지 확인 메커니즘
고집
메시지 확인
MQ가 메시지 시퀀스 일관성을 보장하는 방법
동일한 소비자와 대기열을 바인딩합니다.
MQ 푸시 및 풀 아키텍처 모델
생산자가 소비 결과를 얻는 방법
전역 ID를 비동기적으로 반환하고 프런트 엔드는 ajax를 사용하여 정기적으로 적극적으로 쿼리합니다.
주류 MQ 프레임워크
토끼mq
건축학적 사고
Rabbitmq 관리 플랫폼 센터
가상 호스트
별도의 팀 개발 경로에 메시지 대기열 저장
교환
경로분배 메시지
라우팅 키
RabitMQ 대기열 모델
단순 모드<br>
작업 모드
방송 모드---팬아웃
라우팅 모드 --직접
테마 모드--주제
RabitMQ 4가지 스위치 유형
직접 교환(직접 스위치)
팬아웃 교환
주제 교환
헤더 교환
RabbitMQ 일반적인 면접 질문
RabbitMQ가 메시지가 손실되지 않도록 보장하는 방법
생산자
생산자가 메시지를 MQ 서버에 성공적으로 전달하는지 확인
Ack 메시지 확인 메커니즘(Confirms)
동기식 또는 비동기식 형태
거래 메시지
소비자
소비 수동 수령 모드
자동 서명(권장하지 않음)
수동 서명(권장)
MQ 서버측 메시지 지속성
RabbitMQ 데드 레터 큐
메시지가 MQ로 전달되고 저장되었습니다.
대기열 컨테이너가 가득 찼습니다.
소비자가 여러 메시지를 사용하지 못하면 배달 못한 편지 대기열로 전송됩니다.
RabbitMQ 메시지 자동 재시도 메커니즘
여러 번 시도한 후에도 계속 실패하면 어떻게 해야 합니까?
배달 못한 편지 대기열로 이동
예정보상이나 수동보상을 로그테이블에 기록
소비자 멱등성 문제를 피하는 방법은 무엇입니까?
Global ID 비즈니스 시나리오는 고유성을 보장합니다.
카프카
Kafka 핵심 아키텍처 설계 모델
브로커(MQ 서버측)
주제(업무별로 주제가 분류되어 있음)
Partiiton(파티션 저장 메시지)
생산자
소비자
소비자 그룹
복제본(복제 메커니즘)
오프셋(소비기록)
Kafka가 높은 동시성을 지원할 수 있는 이유
저장소 구조 수준
대역폭 전송을 줄이기 위해 메시지가 압축됩니다.
kafka 파티션 파티션 저장 구조 모델
.log 저장 메시지 파일
.index는 메시지의 색인을 저장합니다.
.timeIndex, 시간 인덱스 파일
분할된 저장 로그(세그먼트 파일)
희소 색인을 사용하여 메시지의 물리적 위치 찾기(각 메시지에 대해 색인이 생성되지 않음)
장점: 공간 절약
메시지가 저장된 후에는 성공적인 소비 후에도 즉시 삭제되지 않습니다. 메시지는 오프셋을 기반으로 획득됩니다(로그 정리 전략 구성을 고려해야 함).
자바 애플리케이션 레벨
생산자
생산자는 일괄적으로 메시지를 전달합니다(버퍼 풀 설계).
소비자
소비자는 일괄적으로 메시지를 얻습니다(여러 오프셋).
파티션당 소비자 1명(확장성)
리눅스 커널 레벨
순차적 읽기 및 쓰기 사용
제로 복사 메커니즘 사용
sendfile mmap 사용자 모드 및 커널 모드 매핑
CPU가 데이터를 복사할 필요가 없습니다.
사용자 모드와 커널 모드 간 전환 횟수를 줄입니다.
페이지 캐시를 사용하여 읽기 및 쓰기 능력 향상
디스크 브러싱 문제도 고려해야
Kafka가 안정적인 메시지를 보장하는 방법
복제
ISR 복제 신뢰성 있는 메커니즘
파티션의 복제본 선택
HW 하이 워터마크: 소비자가 소비할 수 있는 최대 오프셋
LEO 대기열의 가장 큰 오프셋 값
생산자가 메시지 확인을 전달합니다.
0은 생산자가 기다리지 않음을 의미합니다(메시지가 손실될 수 있음).
1은 생산자가 기다리고 있고 리더가 디스크를 플러시하고 있음을 의미합니다(기본 구성 권장).
-1은 생산자가 모든 노드가 동기화될 때까지 기다려야 함을 의미합니다.
Kafka 선거 원칙 컨트롤러 원칙
Zookeeper 임시 노드를 사용하여 선거 구현
소비자가 수동으로 오프셋을 제출함
Kafka는 지정된 오프셋이 있는 메시지를 어떻게 찾나요?
1. 오프셋을 기준으로 세그먼트 파일 검색(이진 검색)
2. 인덱스 파일(스파스 인덱스)에 접근하여 해당 물리적 저장 위치를 찾습니다.
3. 물리적 접속 위치에 따라 로그에 접속하여 물리적으로 해당하는 메시지를 찾습니다.
메시지 인덱스 값 찾기
물리적 메시지를 직접 반환합니다(시간 복잡도 o(1)).
메시지 인덱스 값을 찾을 수 없습니다.
순서대로 검색(시간복잡도 o(N))
Kafka 성능 최적화
생산자
생산자 메모리 버퍼 크기
재시도 정책 "retries" 및 "retries.backoff.ms"
이 매개변수는 재시도 횟수와 간격을 설정합니다.
확인 메커니즘: acks 균형을 위해 1로 설정하는 것이 좋습니다.
소비자
소비자 파티션 수
소비자는 여러 오프셋을 기반으로 일괄적으로 메시지를 얻습니다.
소비자가 수동 오프셋 제출을 활성화합니다.
브로커(MQ 서버측)
로그 보존 정책 구성
로그 데이터 파일 플러시 전략
복제본 복제 구성
네트워크 및 IO 스레드 구성 최적화
MySQL 실질적인 성능 최적화
MySQL 성능 최적화
MySQL 아키텍처 및 실행 프로세스 원칙
SQL 문이 실행되는 방법
내장된 쿼리 캐시
문법 및 어휘 분석
의미론적 프로세서
옵티마이저/실행 계획
쿼리 실행 엔진
InnoDb 메모리 구조와 디스크 구조
버퍼 디자인
버퍼 풀 기능
메모리 버퍼가 꽉 찼습니다. 어떻게 해야 하나요?
버퍼 풀의 크기를 구성하는 방법은 무엇입니까?
MySQL 대기 시간 문제 및 데이터 플러시 전략
MySQL의 추상 데이터 페이지 단위를 이해하는 방법
디스크의 데이터 페이지와 캐시 페이지는 어떻게 서로 대응됩니까?
캐시페이지에 해당하는 설명정보는 무엇인가요?
머신 구성에 따라 버퍼 풀을 적절하게 설정하는 방법
프로덕션 환경에서 버퍼 풀에 메모리를 얼마나 설정해야 합니까?
총 크기 = 2배(청크 크기 * 버퍼 풀 수)
MySQL 기본 통신 프로토콜 원리
리눅스
TCP/IP 소켓
MySQL 메시지
3방향 핸드셰이크 인증
유닉스 소켓
창문들
명명된 파이프
메모리 공유
MySQL 기본 모듈 분할
초기화 모듈
핵심 API
네트워크 상호작용 모듈
클라이언트 및 서버 상호 작용 프로토콜 모듈
사용자 모듈
액세스 제어 모듈
연결 관리, 연결 스레드 및 스레드 관리
쿼리 구문 분석 및 전달 모듈
쿼리 최적화 모듈
로깅 모듈
스토리지 엔진 인터페이스 모듈
MySQL 인덱스의 기본 구현 원리
인덱스 데이터 구조 모델
해시 테이블
이진 검색 트리
레드 블랙 트리
균형 잡힌 다중 포크 검색 트리
B 나무
지수에는 어떤 카테고리가 있나요?
전문 색인
기본 키 인덱스
결합지수
고유 인덱스
innodb와 myisam의 차이점 index의 차이점<br>
MySQL 인덱스 설정 및 사용의 기본 원칙
MySQL 트랜잭션의 기본 원칙
Spring 선언과 프로그래밍 트랜잭션의 차이점
트랜잭션이 시작만 되고 커밋/롤백이 되지 않으면 어떤 문제가 발생합니까?
mysql 다중 버전 제어 MVCC 원리
MySQL 트랜잭션 격리 수준
반복 읽기
커밋 읽기
커밋되지 않은 읽기
직렬화
MySQL 잠금 및 해제 잠금 원칙
행 잠금, 테이블 잠금, 페이지 잠금
비관적 잠금/낙관적 잠금
갭 잠금
갭 잠금이란 무엇입니까?
RR 격리 수준에서 팬텀 읽기를 방지하는 주된 이유는 갭 잠금입니다.
기본 키 인덱스/고유 인덱스 현재 읽기에 갭 잠금이 추가됩니까?
범위 쿼리를 통해 간격 잠금을 추가할지 여부
검색 조건이 존재하지 않으면 현재 읽기에 Gap이 추가됩니까?
교착상태 분석 원리
2단계 잠금
교착상태는 왜 발생하는가?
MySQLUndo 로그의 기본 원칙
Undo-log와 Redo-log의 차이점
UndoLog는 트랜잭션 원자성 원칙을 구현합니다.
RedoLog는 트랜잭션 지속성 원칙을 구현합니다.
MySQL 실질적인 성능 최적화
SQL 느린 쿼리 분석 및 솔루션
MySQL 느린 쿼리를 활성화하는 방법
실행계획의 원리 해석 설명
id: 컬럼이 클수록 실행 우선순위가 높아집니다. id가 같으면 위에서 아래로 실행됩니다. id가 NULL이면 마지막으로 실행됩니다.
select_type: 쿼리 유형을 나타냅니다.
테이블:행이 어떤 테이블에 액세스하는지 설명합니다.
유형 열
체계
const
eq_ref
심판
<p class="MsoNormal"><b><span style="font-family: "Times New Roman"; 글꼴 크기: 10.5pt;">범위 </span></b></p>
색인
모두
Extra는 추가 정보를 의미합니다.
SQL 및 인덱스 최적화의 원칙
인덱스 오류를 방지하려면 가장 왼쪽에 있는 접두사 규칙을 따르세요.
테이블 백 쿼리를 방지하려면 커버링 인덱스를 사용해 보세요.
정렬은 파일 정렬을 피하기 위해 가장 왼쪽 접두사 방법을 따릅니다.
최소 유형은 범위 범위 쿼리 수준을 만족합니다.
ID 조건 필터 offSet 또는 하위 쿼리가 ID 연결을 찾는 페이지 매김 최적화
조인 테이블 쿼리는 큰 테이블 데이터를 구동하기 위해 작은 테이블을 최적화합니다. 3개 이상의 테이블에 대해서는 조인을 사용할 수 없습니다.
퍼지가 가장 왼쪽 접두사 규칙을 따르거나 복합 인덱스 퍼지 쿼리를 사용하는 것처럼
MySQL 구성 최적화 원칙
스토리지 엔진 및 테이블 구조 최적화
Alibaba 개발 매뉴얼 관점에서 MySQL 최적화하기
MySQL 테이블 및 데이터베이스
단일 테이블이 최대 크기에 도달하면 테이블과 데이터베이스로 분할됩니다.
가로 분할과 세로 분할의 차이점
하위 테이블 및 하위 데이터베이스 전략
나머지/범위 모듈로
범위별로 분할
날짜별로 분할
월별로 나누기
열거형 값으로 샤딩
바이너리 모듈로 범위 슬라이싱
일관된 해시 샤딩
대상 필드 접두어로 지정된 파티션<br>
접두사 ASCII 코드 및 값에 따라 모듈로 범위를 분할합니다.
개발자 맞춤화
일반적인 문제
테이블 및 데이터베이스 분할 후 쿼리의 장점과 단점은 무엇입니까?
테이블과 데이터베이스를 분할한 후 페이징 쿼리를 구현하는 방법
테이블과 데이터베이스를 분할한 후 조인 테이블 쿼리를 구현하는 방법
MyCat을 권장하지 않는 이유
네티 심층 소스코드 해석
네트워크 모델의 개념적 기초
TCP/IP 5계층 아키텍처 모델
애플리케이션 레이어
전송 계층
네트워크 계층
데이터링크 계층
물리층
소켓 네트워크 프로그래밍
TCP 프로토콜
UDP 프로토콜
URL 주소를 입력하여 IP 주소 원리를 해결하는 방법
HTTP 프로토콜의 기본 원칙
HTTPS 프로토콜 요청 및 응답 원칙
HTTPS 및 SSL/TLS 원칙
http 프로토콜과 소켓의 차이점
IO 모델 원리
차단 I/O 모델
비차단 I/O 모델
다중화된 I/O 모델
신호 기반 I/O 모델
비동기 I/O 모델
NIO와 BIO의 차이점
AIO 기본 원칙
BIO에서 NIO로의 진화
스트림 지향 및 버퍼 지향
차단 및 비차단
NIO 구현 원리(운영 체제 커널)
핵심 개념
커널 버퍼
프로세스 버퍼
리눅스 커널
선택하다
시간 복잡도는 O(n)이며 파일 설명자를 모니터링하는 데에는 특정 제한이 있습니다.
투표
시간 복잡도는 O(n)이며 파일 설명자를 듣는 데 제한이 없습니다.
에폴
시간 복잡도는 O(1)이며 파일 설명자를 듣는 데 제한이 없습니다.
네티 소스 코드 해석
Netty 일반적인 사용 시나리오
RPC 프레임워크
톰캣 서버
온라인 게임
NIO 아키텍처 원칙
완충기
선택자
통로
네티 고성능 디자인
비동기 비차단 통신
제로 카피/메모리 풀
MMAP 쓰기
Sendfile
생각해 볼 사항:
CPU 복사본 수를 줄이는 방법
직접 메모리 dma 복사 원리
커널 스위치 수를 줄이는 방법
효율적인 Reactor 스레딩 모델
단일 리액터 단일 스레드
단일 리액터 멀티스레딩
원자로 마스터-슬레이브 모델
잠금이 없는 직렬 설계 컨셉
직렬화 프레임워크 지원
네티 소스 코드 해석
Netty 스레드 모델 및 소스 코드 분석
고성능 직렬화 프로토콜 protobuf 및 소스 코드 분석
Sticky Packet Unpacking 현상 및 해결방법, 코덱 소스코드 분석
다이렉트 메모리와 네티 제로 카피에 대한 자세한 설명
네티 프레임워크 실습
Netty 수기 RPC 프레임워크 기반(모방성이 높은 Dubbo)
주사위 놀이 게임의 Netty 필기 멀티플레이어 온라인 버전을 기반으로 합니다.
네티(Netty) 손글씨 웹서버 기반(모방률이 높은 Tomcat)
Linux 시스템 커널 원리 분석
Linux 커널 준비 작업
Linux 커널 아키텍처에 대한 간략한 분석
Linux 아키텍처와 커널 구조의 차이점
Linux 기반 플랫폼 메커니즘
리눅스 커널 아키텍처
Spring 시스템 프레임워크 소스 코드 해석
Spring5 소스 코드 해석
SpringMVC 소스 코드 해석
SpringBoot 소스 코드 해석
새로운 소매 전자상거래 프로젝트
건축 디자인 아이디어
새로운 소매 개념<br>
기술 아키텍처 계획
스프링부트
SpringCloud알리바바
중간 디자인
기술센터
비즈니스 센터
조직센터
클라우드 컴퓨팅
SaaS(서비스로서의 소프트웨어)
PaaS(플랫폼 서비스)
IaaS(인프라 서비스)
Devops와 K8S 운영 및 개발 통합
오전
서비스 추적 구현
모니터링 알람
앞부분과 뒷부분 분리
프런트엔드 -----vue는 Ajax 기술과 유사하며 프런트엔드 엔지니어가 구현합니다.
백엔드 ------ 인터페이스 형태 백엔드 엔지니어가 Java를 구현합니다.
인프라 서비스 구축
Nacos 서비스 등록 센터/구성 센터 배포
엔터프라이즈급 Maven 개인 서버 구축
마이크로서비스 팀에서 RPC 인터페이스 호출 구현
API 인터페이스 사양 프로토콜 정의
엔터프라이즈급 코드 웨어하우스 관리 플랫폼 구축
po/do/vo/dto/bo 선택 애플리케이션
목적은 RPC로 전송되는 데이터의 보안을 보장하는 것입니다.
앱 선택
DO(Data Object): 데이터베이스 테이블 구조에 일대일로 대응하며, DAO 계층을 통해 데이터 소스 객체를 상위로 전달한다.
DTO(Data Transfer Object): 데이터 전송 객체, 서비스나 관리자가 외부로 전송하는 객체
BO(비즈니스 개체): 비즈니스 개체입니다. 서비스 레이어의 비즈니스 로직 출력을 캡슐화하는 객체
AO(Application Object): 애플리케이션 객체. 웹 레이어와 서비스 레이어 간의 추상 재사용 객체 모델
VO(View Object): 표시 레이어 개체, 일반적으로 웹에서 템플릿 렌더링 엔진 레이어로 전송되는 개체입니다.
회원센터 디자인
로그인 인터페이스 구현
세션을 사용하지 않는 이유
세션이 jvm 서버에 저장되면 노드 클러스터 동기화 문제를 고려해야 합니다.
토큰 구현 방법
구현원리
Redis의 키 값인 토큰(UUID)을 userid로 무작위로 생성합니다.
토큰을 클라이언트에 반환하면 클라이언트는 토큰을 전달할 때마다 인터페이스를 호출합니다.
장점과 단점
이점
매개변수 신뢰성 숨기기
결점
Redis 쿼리를 거쳐야 함
JWT 구현
구성 요소
헤더(헤더)
페이로드(페이로드)
서명
장점과 단점
이점
사용자 데이터를 서버에 저장할 필요가 없어 서버측 부담이 줄어듭니다.
가볍고 json 스타일은 비교적 간단합니다.
교차 언어
결점
유효 기간을 업데이트할 수 없습니다.
JWT를 삭제할 수 없습니다.
Jwt에서 로그아웃을 구현하는 방법
브라우저 쿠키 지우기(그러나 서버는 여전히 존재함)
시간을 조금 짧게 설정하는 것이 좋습니다
멀티스레딩과 스레드 풀링 통합
로그인 후 전송되는 이메일, 문자 메시지, 쿠폰 등을 멀티스레딩으로 처리하여 인터페이스 응답 효율성을 향상시킵니다.
대규모 프로젝트에서는 시간이 많이 소요되는 mq 비동기 처리를 사용하여 서버 CPU 리소스를 줄입니다.
SSO 싱글 사인온
웹 양식
쿠키를 기반으로 구현됨
앞부분과 뒷부분 분리
토큰 또는 JWT를 기반으로 구현됨
일반적인 문제
실제 클라이언트의 IP 정보를 얻는 방법
nginx에서 사용자의 실제 IP를 설정하여
프런트엔드와 백엔드 분리라는 도메인 간 문제를 해결하는 방법
jsonp를 사용하지만 게시 요청을 지원하지 않습니다(권장하지 않음)
SpringMVC @CrossOrigin 주석 사용(권장)
게이트웨이 기반 교차 도메인 문제 해결(권장)
Nginx 기반의 다양한 프로젝트에 대한 액세스(권장)
공동 로그인 구현
oauth2 개방형 프로토콜
1. appid를 기반으로 인증링크 주소 생성
2. 인증코드 받기
3. 인증 코드를 기반으로 accessToken을 얻습니다.
4. 인증코드를 기반으로 사용자 정보 획득
분산 솔루션
기존 수집 로그의 단점
tail을 사용하여 각 서버의 로그 검색
해결책
aop elk kafka는 분산 로그 수집을 구현합니다.
엘크가 카프카를 추가해야 하는 이유
각 Logstash 설치에 대한 운영 및 유지 관리 비용 절감
지침
AOP는 수집된 로그를 동시 대기열에 캐시하고 비동기식 별도 스레드를 통해 Kafka에 로그를 전달합니다.
통합 결제 설계
결제 아키텍처 프로세스
서명 방법 확인
RSA 비대칭 암호화
MD5
콜백 메소드
동기식 콜백
제3자 결제가 성공하면 결제 브라우저 리디렉션 형태로 판매자 측으로 이동합니다.
비동기 콜백
제3자 결제는 HttpClient와 유사한 기술을 사용하여 판매자에게 알림을 보냅니다.
디자인 패턴
전략 패턴
템플릿 메소드 패턴
일반적인 문제
동기 콜백과 비동기 콜백이 인터페이스 보안을 보장하는 방법
동기식 콜백은 브라우저 형태로 점프하며 주문 상태를 수정하지 않습니다.
비동기 콜백이 서명을 성공적으로 확인한 후 멱등성 문제에 주의하여 주문 상태를 수정하세요.
사용자가 반복적으로 결제하는 것을 방지하는 방법
동일한 주문 번호가 양식에서 제3자 결제로 제출되며, 제3자 결제는 주문 번호를 기준으로 전역 고유성을 보장합니다.
사용자의 결제가 성공적으로 이루어졌으나 주문 상태가 여전히 미결제인 경우 어떻게 해야 하나요?
이러한 현상은 정상적인 현상입니다. 최종 일관성을 통해 Alipay 인터페이스를 적극적으로 호출하여 주문이 결제되었는지 확인할 수 있습니다.
사용자 결제 금액과 주문 금액이 일치하지 않는 경우 처리 방법
비동기식 콜백에서는 주문을 기준으로 사용자의 실제 주문번호와 결제금액이 일치하는지를 조회합니다.<br>일치하지 않는 경우 비정상적인 주문입니다.
어떤 유형의 결제 테이블 금액 필드가 적합합니까?
정수 유형의 직접 저장은 나중에 요소로 변환될 수 있습니다.
십진수 유형
30분 초과 근무에 대한 미지급 주문 처리 방법
MQ 지연큐 기반으로 구현(권장)
1. 주문 성공 후 지연된 대기열 메시지를 MQ로 전달합니다.
2. 메시지가 만료되면 배달 못한 편지 대기열로 전송됩니다.
3. 배달 못한 편지 대기열 소비자는 메시지를 듣고 주문 상태가 결제되었는지 확인합니다.
Redis 만료된 키를 기반으로 구현됨(권장되지 않음)
1. 성공적으로 주문한 후 Redis에 만료 키를 30분으로 설정합니다.
2. 클라이언트는 키 만료를 모니터링할 때 주문 상태가 결제되었는지 확인합니다.
3. 만료된 키 모니터링을 활성화하려면 접두사에 주의하고 별도의 Redis 라이브러리를 구독해야 합니다.
일반적인 문제
사용자의 카드는 30분 이내에 결제됩니다. 주문 상태의 일관성을 보장하는 방법은 무엇입니까?
1. Alipay 주문 리디렉션 시간 제한을 30분으로 설정합니다.
2. 지연 대기열은 Alipay 인터페이스를 적극적으로 호출하여 약 31~35분 동안 주문 번호를 기반으로 결제 상태를 확인합니다.
3. Alipay 인터페이스를 호출한 후에도 여전히 결제가 이루어지지 않으면 주문에 시간이 많이 걸리는 것으로 간주됩니다.
제품 서비스 시스템 아키텍처 설계
높은 동시성에 대한 저항을 달성하는 방법
프런트엔드 레이어
최적화
동적 및 정적 분리 아키텍처
정적 리소스 서버
동적 리소스 서버
정적 리소스 압축
.min 파일 생성
CDN 캐시
근접성의 원칙에 따라 방문
최종 효과
대역폭 전송 감소
인터페이스 레이어
최적화
GC 재활용 stw 문제 수를 줄이기 위한 JVM 매개변수 조정
멀티스레딩/MQ 비동기식 디커플링 형태로 시간이 많이 소요되는 작업을 처리합니다.
Redis 캐시를 사용하여 DB 액세스 부담을 줄이세요
MySQL 대용량 데이터를 위한 테이블 및 데이터베이스 분할/인덱스 최적화 고려
최종 효과
운영 및 유지 관리 계층
docker 또는 K8S를 사용하여 배포를 탄력적으로 확장/축소
자바SE
기본 문법
데이터 유형
기본 데이터 유형
숫자 유형
정수(바이트, short, int, long)
부동 소수점 수(float, double)
문자(char)
숫자가 아닌 유형
부울
참조 데이터 유형
수업
상호 작용
정렬[]
객체지향
수집 프레임워크
IO 스트림
반사 메커니즘
멀티스레딩
JDBC
자바웹
베이스
서블릿
JSP
액자
봄5
Spring5와 SpringBoot의 관계
SpringBean 주입 방법
SpringBean 주입 방법
파라메트릭 생성자 주입 속성
p 네임스페이스 주입
Null 값 및 특수 기호 삽입
내부 콩 주입
외부 콩 주입
캐스케이드 할당 삽입
컬렉션 유형 속성 삽입
스프링 팩토리 콩
SpringBean 수명주기
1단계: 리플렉션 기술을 사용하여 개체를 초기화하고 인수 없는 생성자 호출
2단계: 리플렉션을 사용하여 set 메서드를 호출하여 속성에 값을 할당합니다.
세 번째 실행 단계: Bean의 후처리기 사전 메소드
4단계: 객체에서 init 메소드 호출
5단계: Bean의 후처리기 후처리 방법
6단계: 객체를 삭제하고 삭제 메서드 호출
SpringBean 범위
싱글톤 객체
다중 인스턴스 객체
SpringBean 자동 배선
SpringBean 외부 속성 파일
SpringBean 주석 양식
SpringBean 주석 시작 방법
SpringBean의 주석 시작 기능
SpringBean 주석 스캐닝 구성
Autowired 및 Qualifier 주석
@자원 사용
스프링빈 AOP
AOP 기본 개념
AOP의 기본 역할
정적 프록시 및 동적 프록시
@AspectJ 주석 사용법
aop를 사용하여 로그를 균일하게 인쇄
SpringBean 트랜잭션 작업
거래의 분류
수동 거래
프로그래밍 문제
업무의 7가지 의사소통 행동
PROPAGATION_REQUIRED(기본 전파 동작)
현재 스레드에 트랜잭션이 있으면 현재 트랜잭션에 참여합니다.
현재 스레드에 대한 트랜잭션이 없으면 새 트랜잭션을 만듭니다.
PROPAGATION_지원
현재 스레드에 트랜잭션이 있으면 현재 트랜잭션에 참여합니다.
현재 스레드에 트랜잭션이 없으면 트랜잭션이 아닌 방식으로<br>실행됩니다.
PROPAGATION_MANDATORY
현재 스레드에 트랜잭션이 있으면 현재 트랜잭션에 참여합니다.
현재 스레드에 트랜잭션이 있으면 예외가 발생합니다.
PROPAGATION_REQUIRES_NEW
현재 스레드에 트랜잭션이 존재하면 현재 트랜잭션이 일시 중단되고 새 트랜잭션이 생성됩니다.
PROPAGATION_NOT_지원됨
항상 비트랜잭션 방식으로 실행됨
전파_절대 안함
항상 비트랜잭션 방식으로 실행되며, 현재 스레드에 트랜잭션이 존재하면 예외가 발생합니다.
PROPAGATION_NESTED
현재 스레드에 트랜잭션이 있으면 트랜잭션이 중첩됩니다.
스프링MVC
마이바티스
최대 절전 모드
마이크로서비스
스프링부트2.0
SpringBoot 프레임워크를 사용해야 하는 이유
개발자가 타사 프레임워크를 신속하게 통합하는 데 도움이 될 수 있습니다(원리: Maven 종속성 캡슐화).
xml 구성을 제거하고 Annotation을 완전하게 사용(원리: Spring 시스템에 내장된 Annotation 메소드)
외부 Tomcat 및 내부 구현 서버가 필요하지 않습니다. (원리: Java 언어는 내장된 Tomcat 서버를 지원합니다.)
SpringBoot와 SpringCloud의 차이점
SpringCloud 종속성 및 SpringBoot 구성 요소
SpringMVC를 사용하여 Http 프로토콜 인터페이스 작성
Spring Cloud는 완전한 마이크로서비스 솔루션 프레임워크입니다.
SpringBoot 종속성 소개 소개
스프링 부트 시작 부모,
스프링 부트 스타터 웹
@RestController 역할
Controller의 모든 메소드는 JSON 형식을 반환합니다.
SpringBoot 시작 방법
@EnableAutoConfiguration
@ComponentScan
@SpringBootApplication
현재 패키지 또는 하위 패키지 아래의 모든 클래스를 검색할 수 있습니다.
SpringBoot는 정적 리소스 액세스를 통합합니다.
템플릿 엔진 프레임워크
SEO 검색에 도움이 되는 웹 렌더링
FTL 템플릿 엔진 통합
thymeleaf 템플릿 엔진 통합
SpringBoot는 데이터 소스를 통합합니다.
Jdbc템플릿
마이바티스
동면하다
SpringBoot 통합 핫 배포
devtools 도구 통합
클래스 로더 구현
롬복 통합
SpringBoot 통합 구성 파일
@value 주석을 사용하여 구성 파일 읽기
속성은 yml 형식을 변환합니다.
@ConfigurationProperties
구성 파일 자리 표시자 사용
여러 환경에서 다양한 구성 파일 통합
포트 및 컨텍스트 경로 수정
SpringBoot 통합 로그 프레임워크
로그백
log4j
aop를 사용하여 로그 정보를 균일하게 인쇄
SpringBoot 예약 작업
예약된 작업 @Scheduled 주석 통합
Quartz 표현식과 결합된 시간별 통합 작업
SpringBoot는 비동기식 멀티스레딩을 통합합니다.
@Async 무효화 문제에 주의하세요
@Async는 스레드 풀을 통합합니다.
전역 catch 예외 통합
패키지 및 실행 릴리스
프로젝트 도구
도커
기본 사상
도커를 사용해야 하는 이유
도커 사용의 이점
컨테이너와 가상 머신의 차이점
환경 설치
Linux 환경에 docker 설치
Win 환경에 Docker 설치
세 가지 주요 요소
이미지 파일
컨테이너
창고
거울 원리
Docker 다운로드 이미지 원리
Docker 이미지 로딩 원리
bootfs
루트프스
유니온 FS
클라우드 가속 이미지 구성
Alibaba Cloud 가속 이미지
Huawei 클라우드 가속 이미지
HKUST 가속 미러
도커 일반 명령
docker --help(도움말 명령)
docker --version (버전 보기)
도커 이미지(이미지 보기)
도커 검색(검색 이미지)
도커 풀(다운로드 이미지)
최신 -----이미지 파일의 최신 버전 태그 지정
도커 컨테이너
docker run(컨테이너 시작)
docker start는 컨테이너 ID를 시작합니다.
도커 중지 컨테이너 ID
도커 RM 컨테이너 ID
docker exec -it [CONTAINER ID] bash(컨테이너 입력)
docker 로그 --30분 이후 CONTAINER_ID(컨테이너 로그 보기)
Docker Commit(현재 컨테이너를 기반으로 이미지 파일로 생성)
도커 데이터 볼륨 -v
일반적으로 사용되는 소프트웨어 설치
수코양이
docker run -p 8081:8080 -d tomcat:8
엔진스
docker run --name nginx81 -d -p 81:80
MySQL
docker create --name mysql3308 -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 mysql:5.7
DockerFile 구문 분석
DockerFile 작성 사양
DockerFile 지시어
Dockerfile을 기반으로 springboot 프로젝트 빌드
도커 작성
일반 명령 작성
도커 작성 -h
도커 작성
도커 작성
도커 작성 로그
도커 작성 풀
Dokcer-작성 구성
도커 작성 다시 시작
도커 작성 시작
템플릿 파일 작성
SpringBoot MySQL Nginx 마이크로서비스 프로젝트 배포
Docker 시각화 도구 사용법
포터
DockerUI
k8s
메타네이티브 개념
마이크로서비스
애플리케이션 간의 안정적인 통신
독립적으로 배포/탄력적으로 확장 및 축소 가능
데브옵스
자동 릴리스 파이프라인, Ci/CD 도구
프로덕션 환경을 빠르게 배포
개발과 운영, 유지보수의 통합
지속적인 전달
빈번한 릴리스, 빠른 배송, 빠른 피드백 및 릴리스 위험 감소
컨테이너화
마이크로서비스를 위한 최고의 캐리어
디자인 패턴
프록시 모드