Galleria mappe mentale Percorso di avanzamento Java architect p5-p7 con stipendio annuo di 500.000-700.000
Percorso di avanzamento dell'architetto Java p5-p7 con uno stipendio annuo di 500.000-700.000, struttura dati e algoritmo pratici, modello di struttura dati della soluzione microservizi, ottimizzazione pratica delle prestazioni della macchina virtuale JVM. Pratica di programmazione concorrente, interpretazione del codice sorgente del framework di microservizi, interpretazione del codice sorgente del framework di raccolta, soluzioni di architettura distribuita. Progettazione e effettiva implementazione dell'architettura delle transazioni distribuite su Internet, principi del middleware dei messaggi distribuiti, ottimizzazione delle prestazioni effettive di MySQL e interpretazione approfondita del codice sorgente di Netty.
Modificato alle 2023-11-21 16:53:38Microbiologia medica, Infezioni batteriche e immunità riassume e organizza i punti di conoscenza per aiutare gli studenti a comprendere e ricordare. Studia in modo più efficiente!
La teoria cinetica dei gas rivela la natura microscopica dei fenomeni termici macroscopici e le leggi dei gas trovando la relazione tra quantità macroscopiche e quantità microscopiche. Dal punto di vista del movimento molecolare, vengono utilizzati metodi statistici per studiare le proprietà macroscopiche e modificare i modelli di movimento termico delle molecole di gas.
Este é um mapa mental sobre uma breve história do tempo. "Uma Breve História do Tempo" é um trabalho científico popular com influência de longo alcance. Ele não apenas introduz os conceitos básicos da cosmologia e da relatividade, mas também discute os buracos negros e a expansão. Do universo. questões científicas de ponta, como inflação e teoria das cordas.
Microbiologia medica, Infezioni batteriche e immunità riassume e organizza i punti di conoscenza per aiutare gli studenti a comprendere e ricordare. Studia in modo più efficiente!
La teoria cinetica dei gas rivela la natura microscopica dei fenomeni termici macroscopici e le leggi dei gas trovando la relazione tra quantità macroscopiche e quantità microscopiche. Dal punto di vista del movimento molecolare, vengono utilizzati metodi statistici per studiare le proprietà macroscopiche e modificare i modelli di movimento termico delle molecole di gas.
Este é um mapa mental sobre uma breve história do tempo. "Uma Breve História do Tempo" é um trabalho científico popular com influência de longo alcance. Ele não apenas introduz os conceitos básicos da cosmologia e da relatividade, mas também discute os buracos negros e a expansão. Do universo. questões científicas de ponta, como inflação e teoria das cordas.
Il percorso verso l'avanzamento come architetto JAVA
Struttura dei dati e pratica degli algoritmi
Ripasso delle conoscenze di matematica
indice
logaritmo
serie
Aritmetica del modulo
la complessità
complessità temporale
complessità spaziale
struttura dati
modello a pila
Principio del primo entrato, ultimo uscito
Pop/Spingi
applicazione dello stack
modello di coda
principio first in first out
coda sequenziale
coda concatenata
deque
coda prioritaria
modello ad albero
Albero binario
Albero AVL
albero binario indizio
albero rosso nero
albero diffuso
Modello hash
funzione hash
Metodo di rilevamento lineare
metodo di rilevamento quadrato
doppio hash
Metodo della funzione hash
metodo di indirizzamento diretto
analisi digitale
Metodo quadrato-medio
metodo di piegatura
Metodo della divisione con resto
metodo dei numeri casuali
Come gestire i conflitti
Sondaggio lineare e quindi hashing
sondaggio quadrato e hashing
modello heap
Mucchio di sinistra
mucchio obliquo
Pratica dell'algoritmo
Algoritmo di ordinamento
ordinamento di inserimento
Ordinamento collinare
Ordinamento dell'heap
unisci ordinamento
Ordinamento rapido
Ordinamento a bolle
Algoritmo pratico
algoritmo avido
Codifica di Huffman
Problema di imballaggio approssimativo del contenitore
algoritmo divide et impera
Dividi e conquista il tempo di esecuzione dell'algoritmo
Problemi recenti
Seleziona la domanda
programmazione dinamica
Utilizzare una tabella anziché la ricorsione
L'ordine di moltiplicazione delle matrici
albero binario di ricerca ottimale
Il percorso più breve per tutte le coppie di punti
algoritmo di randomizzazione
generatore di numeri casuali
tavola per saltare
prova attitudinale
Modello di struttura dati della soluzione microservizi
Algoritmo del cluster del centro di registrazione
Algoritmo Raft per l'elezione del cluster Nacos
Algoritmo di diffusione dell'epidemia Protocollo P2P-Gossip
Protocollo di coerenza della trasmissione dei messaggi Eureka
Protocollo di coerenza delle transazioni distribuite
Protocollo di forte coerenza
Protocollo di coerenza debole
eventuale protocollo di coerenza
Algoritmo del protocollo di consenso dei guardiani dello zoo
Protocollo di trasmissione atomica ZAB
Protocollo di consenso di Paxos
Algoritmo di eliminazione della cache distribuita
Algoritmo di eliminazione della cache LRU (utilizzato meno recentemente).
Algoritmo di eliminazione della cache LFU (algoritmo meno frequente).
Algoritmo di eliminazione della cache ARC (Adaptive Cache Sostituzione Algorithm).
Algoritmo di eliminazione della cache FIFO (first in, first out).
Algoritmo di eliminazione della cache MRU (usato più recentemente).
Protocollo di suddivisione della cache distribuita
filtro fioritura
filtro a cucù
Algoritmo di bilanciamento del carico
Algoritmo del meccanismo di polling
algoritmo casuale
algoritmo ip fisso
algoritmo del peso
Algoritmo di limitazione della corrente del microservizio
Algoritmo del contatore (finestra fissa).
algoritmo della finestra scorrevole
algoritmo del secchio che perde
Algoritmo del bucket di token
Algoritmo di pianificazione delle attività di elaborazione distribuita (xxl-job)
metodo di rotazione
metodo di ponderazione
Hashing
metodo almeno join
metodo delle mancanze minime
metodo di risposta più rapido
algoritmo genetico
Soluzione dell'algoritmo della colonia di formiche
Protocollo di sincronizzazione e coerenza dei dati distribuiti
MySQL
replica semisincrona
Replica asincrona
Sincronizzazione globale
cache
canale
lontra
(openresty/tengine) Concorrenza elevata effettiva
Modulo core nativo di Nginx
Tipi di moduli Nginx
Modulo HTTP standard
Modulo HTTP opzionale
Modulo di terze parti (lua)
Modello e funzionalità basati sugli eventi di Nginx
Configurazione principale di Nginx
Configurazione dell'host virtuale
a monte
posizione
Configurazione della directory statica
Configurazione del protocollo https
Configurazione dell'algoritmo di bilanciamento del carico Nginx
Algoritmo del meccanismo di polling
algoritmo casuale
algoritmo ip fisso
algoritmo del peso
openrest/tengine
Openresty si unisce a Lua per realizzare una pagina dei dettagli del prodotto a livello di miliardo
Tengine è un progetto di server web sviluppato da Alibaba
Ottimizzazione pratica delle prestazioni della macchina virtuale JVM
Storia dello sviluppo del linguaggio di programmazione
Linguaggio assembly/linguaggio macchina
Linguaggio C/C
java/php/linguaggio facile/ython
Caricatore di classi JVMClassLoader
Analisi del principio di implementazione del caricatore di classi dal codice sorgente della macchina virtuale HotSpot (C).
Cos'è un caricatore di classi
Leggi il nostro file di classe in memoria
Classificazione dei caricatori di classi
Caricatore di classi Bootstrap (scritto in C)
$JAVA_HOME/jre/lib
Caricatore di classi di estensione (scritto in Java)
JAVA_HOME/jre/lib/ext
(Applicazione) Caricatore di classi AppClassLoader (scritto in Java)
Pacchetti di classi e jar in classpath
Caricatore di classi personalizzato (scritto in Java)
Directory dei file di classe personalizzata
Vantaggi del meccanismo di delega dei genitori
Lo scopo è prevenire conflitti tra le classi definite dagli sviluppatori e le classi del codice sorgente definite da jdk e garantire l'unicità della classe in memoria.
Principio di delega genitore del caricatore di classi e come infrangerlo
meccanismo spi
Analisi approfondita del codice sorgente della classe di avvio/estensione/caricatore di classi dell'applicazione
Principio dell'interfaccia Java SPIService Provider
Principio di implementazione del caricatore di classi Tomcat/Jetty
Come personalizzare un caricatore di classi per caricare bytecode e plug-in di distribuzione a caldo scritti a mano
Disco locale
Acquisizione della rete
Banca dati
Generazione di proxy dinamici
guerra/vaso
Analisi dei principi della struttura della memoria JVM
Zona di runtime JVM
contatore di programma
Registrare il numero di riga del codice di esecuzione del thread corrente per facilitare il successivo cambio di contesto della CPU per riprendere l'esecuzione.
mucchio
i nuovi oggetti vengono archiviati nell'heap (condiviso dai thread)
Risoluzione dei problemi relativi alle perdite di memoria heap nell'ambiente di produzione
perdita di memoria
Che cos'è una perdita di memoria heap
Spazio applicativo della memoria heap, GC non può rilasciare la memoria
Scenari in cui si verificano perdite di memoria
Perdita di memoria threadlocale
Perdita di memoria dell'oggetto chiave personalizzata hashMap
Risoluzione dei problemi relativi alle perdite di memoria heap nell'ambiente di produzione
Jps/Jmap
Jvisualvm/jconsole
eccesso di memoria
Cos'è l'overflow della memoria heap
Quando si richiede spazio nella memoria heap, non c'è abbastanza spazio.
Overflow della memoria heap
La quantità di dati caricati nella memoria è eccessiva, ad esempio vengono recuperati troppi dati dal database contemporaneamente
C'è un riferimento all'oggetto nella classe di raccolta, che non viene cancellato dopo l'uso, rendendo la JVM incapace di riciclarlo.
È presente un ciclo infinito nel codice oppure il ciclo genera troppe entità oggetto duplicate.
Il valore della memoria dei parametri di avvio imposta la memoria heap su un valore troppo piccolo.
Soluzione per l'eccesso di memoria
Aumenta la memoria heap
Dettagli sulla struttura della memoria heap
Divisione della struttura heap
Nuova generazione/vecchia generazione
nuova generazione
L'oggetto appena creato viene memorizzato nella nuova generazione
vecchiaia
Gli oggetti usati di frequente vengono memorizzati nella vecchia generazione
Versione JDK
jdk1.7
eden (Giardino dell'Eden) da (s0) a (s1) generazione permanente (area metodo)
jdk1.8
eden (Giardino dell'Eden) da (s0) a (s1) generazione permanente (metaspazio)
caratteristica:
Il rapporto predefinito tra la nuova generazione e la vecchia generazione è 1:2
-XX:Nuovo rapporto
Eden predefinito con s0/s1 8:1:1
-XX: rapporto sopravvissuti
parole comuni
YoungGen (nuova generazione)
oldGen (vecchia generazione)
s0(da)
s1(a)
PermGen (generazione permanente)
Metaspazio
Classificazione di GC
raccolta parziale
Collezione di nuova generazione (Minor GC/Young GC)
Collezione di vecchia generazione (GC maggiore/GC antico)
CMS GC raccoglierà separatamente la vecchia generazione.
Raccolta dell'heap e dell'area del metodo
(GC completo): raccoglie la garbage collection dell'intero heap Java e dell'area del metodo (meta spazio)
Domande comuni nell'intervista
La differenza tra GC completo e GC minore/GC giovane
Il gc completo attiverà la raccolta di nuova e vecchia generazione
Minor GC attiva la raccolta GC di nuova generazione
I tempi di raccolta dei GC minori sono molto frequenti
il gc completo attiva il riciclo quando non c'è memoria sufficiente nella vecchia generazione o nell'area del metodo (metaspazio)
L'efficienza di recupero del GC completo è molto bassa
Cerca di non attivare il riciclo completo del GC
Dove vengono conservati gli oggetti di grandi dimensioni?
Se l'area dell'eden non può essere salvata, verrà archiviata direttamente nella vecchia generazione.
Analisi dei log GC
fuga della memoria
Garanzia di spazio
Analisi della struttura interna di thread stack e stack frame
tabella delle variabili locali
pila di operandi
connessione dinamica
esportazione del metodo
Tecnologia dello stack del metodo locale (JNI che chiama codice C).
Pool costante di stringhe
Classificazione del pool costante
pool statico costante
Esegui pool costante
Pool costante di stringhe
Pool costante in aree di archiviazione di versioni JDK diverse
Il pool di costanti di stringa in JDK1.6 e precedenti è archiviato nell'area del metodo (generazione permanente)
In JDK1.7, il pool di costanti di stringa inizia a essere archiviato nell'heap
Il pool di costanti di stringa in JDK1.8 è archiviato nell'heap
Domande comuni sull'intervista String
Perché JDK1.7 ha iniziato a memorizzare il pool costante di stringhe nell'heap?
In JDK7, il pool costante di stringhe viene inserito nello spazio heap. Poiché l'efficienza di riciclaggio della generazione permanente è molto bassa, la raccolta dei rifiuti della generazione permanente verrà eseguita solo durante il GC completo e il GC completo verrà attivato quando lo spazio nella vecchia generazione non è sufficiente e la generazione permanente è insufficiente .
Ciò si traduce in una bassa efficienza di riciclaggio del pool costante di stringhe Nel nostro sviluppo, verrà creato un gran numero di stringhe e l'efficienza di riciclaggio è bassa, con conseguente memoria di generazione permanente insufficiente. Mettendolo nell'heap può recuperare la memoria nel tempo.
Stringa s1 = "mayikt";
String s1 = "mayikt"; s1 punta al pool costante di stringhe
new String("mayikt");
Crea un indirizzo dello spazio heap nell'heap e restituiscilo a s2 s2 ottiene l'indirizzo di memoria heap e mayikt introduce il pool di costanti di stringa nella classe String.
Layout della memoria degli oggetti JVM
disposizione degli oggetti
Intestazione dell'oggetto
Dati dell'istanza
Allinea l'imbottitura
Quanti byte occupa un nuovo oggetto?
Posizione di accesso all'oggetto
modalità di gestione
Una parte di memoria può essere divisa nell'heap Java come pool di handle. Ciò che viene memorizzato nel riferimento nella variabile locale è l'indirizzo dell'handle dell'oggetto.
metodo del puntatore diretto
Ciò che viene memorizzato in riferimento è direttamente l'indirizzo dell'oggetto.
Come vengono creati gli oggetti
1.nuovo oggetto
2. Crea oggetti usando la riflessione
3. Utilizzare clone() per clonare l'oggetto
4. Utilizzare oggetti deserializzati
5. La libreria di terze parti Objenesls crea oggetti
Crea i dettagli dell'oggetto
1. Controlla se la classe dell'oggetto è stata caricata, analizzata e inizializzata
1. Quando la Java virtual machine incontra una nuova istruzione bytecode, controllerà innanzitutto se i parametri di questa istruzione possono individuare il riferimento simbolico della classe nel pool costante (nel metaspazio) e controllerà la classe rappresentata da questo riferimento simbolico. Se è stata caricata, analizzata e inizializzata (per determinare se la classe è stata caricata dal metaspazio)
In caso contrario, è necessario eseguire prima il processo di caricamento della classe corrispondente (quindi utilizzare il meccanismo di delega genitore per trovare la classe (percorso completo della classe), se non viene trovata, verrà segnalato un errore: ClassNotFoundException).
2. Una volta superato il controllo di caricamento della classe, la macchina virtuale allocherà memoria per il nuovo oggetto.
Da utilizzare se la memoria heap è regolare
collisione del puntatore
Da utilizzare se la memoria heap è irregolare
elenco gratuito
3. La creazione di oggetti è un comportamento molto frequente in una macchina virtuale Anche se si modifica solo la posizione puntata da un puntatore, non è thread-safe in circostanze simultanee.
1. Utilizzare il tentativo di errore CAS per garantire l'atomicità degli aggiornamenti;
2. Assegnare un pezzo di spazio TLAB univoco al thread corrente in Eden (Eden Campus) per ciascun thread.
4. Impostare il valore predefinito dell'attributo. Una volta completata l'allocazione della memoria, la macchina virtuale deve inizializzare lo spazio di memoria allocato (esclusa l'intestazione dell'oggetto) su zero. Se viene utilizzato TLAB, questo lavoro può anche essere allocato in anticipo a TLAB. Questo passaggio garantisce che i campi di istanza dell'oggetto possano essere utilizzati direttamente nel codice Java senza assegnare valori iniziali, in modo che il programma possa accedere ai valori zero corrispondenti ai tipi di dati di questi campi.
5. Impostare le informazioni sull'intestazione dell'oggetto. La Java virtual machine deve inoltre effettuare le impostazioni necessarie per l'oggetto, ad esempio di quale classe l'oggetto è un'istanza, come trovare le informazioni sui metadati della classe e il codice hash dell'oggetto. (in realtà il codice hash dell'oggetto verrà ritardato finché non verrà effettivamente chiamato il metodo Object::hashCode()), l'età di generazione del GC dell'oggetto e altre informazioni. Queste informazioni vengono memorizzate nell'intestazione dell'oggetto (Object Header) dell'oggetto. A seconda dello stato di esecuzione corrente della macchina virtuale, ad esempio se il blocco del bias è abilitato, ecc., l'intestazione dell'oggetto verrà impostata in modi diversi.
6. Eseguire il metodo init per l'inizializzazione
Algoritmo di garbage collection JVM
Algoritmo di raccolta dei rifiuti
Algoritmo di marcatura e scansione
Vantaggi: alta efficienza/nessun indirizzo di memoria in movimento
Svantaggi: incline alla frammentazione
algoritmo di ordinamento dei tag
Vantaggi: Evita problemi di frammentazione
Svantaggi: spostamento dell'indirizzo di memoria, bassa efficienza
Algoritmo di copia contrassegnata
Vantaggi: evita problemi di frammentazione
Svantaggi: spostamento dell'indirizzo di memoria, alta efficienza
Principio dell'algoritmo generazionale
nuova generazione
vecchiaia
Collettore JDK1.0-14
Combinazione di raccoglitore di rifiuti
(Parallelo nella nuova generazione) ParNew (seriale nella vecchia generazione) Seriale vecchio
(Seriale di nuova generazione) Seriale, (Vecchia generazione) Seriale vecchio
(Seriale di nuova generazione) Seriale/CMS (Concorrenza di vecchia generazione)
(JDK9 obsoleto)
(Concorrenza nella nuova generazione) ParNew/CMS (Concorrenza nella vecchia generazione)
(Non consigliato per JDK9)
(Parallelo di nuova generazione) Parallelo/SerialeVecchio (Seriale di vecchia generazione)
Non consigliato
(Parallelo nella nuova generazione) Parallel Scavenge/Parallel Old (parallelo nella vecchia generazione)
Impostazione predefinita JDK8
Intera raccolta heap G1 (impostazione predefinita JDK9).
Impostazione predefinita JDK8
Seriale (riciclaggio del thread GC singolo)
Spiegazione dettagliata del Garbage Collector seriale
combinazione
Algoritmo di replica marcata di nuova generazione (seriale).
Algoritmo di compressione seriale old-mark
Scenari applicativi
Utilizza CPU single-core e memoria ridotta
Parallelo (riciclaggio di più thread GC)
Spiegazione dettagliata del Garbage Collector ParNew
Scenari applicativi
nuova generazione
Adatto per CPU multi-core
combinazione
(Vecchia generazione) Seriale vecchio (algoritmo di compressione dei contrassegni)
(Vecchia generazione) CMS (algoritmo Mark and Sweep)
Spiegazione dettagliata del Garbage Collector parallelo
Scenari applicativi
Collezioni GC multiple di nuova/vecchia generazione contemporaneamente
combinazione
Parallelo
OldGC parallelo
Concorrenza (GC e thread utente vengono eseguiti simultaneamente)
Principio del Garbage Collector del CMS (punti chiave)
Principio di attuazione
contrassegno iniziale
marcatura contemporanea
rietichettare
Concorrente chiaro
Quali sono i difetti del raccoglitore CMS?
L'algoritmo Mark-and-Sweep causa problemi di frammentazione
L'alternativa SerialOld è inefficiente
Risolvi il problema delle etichette mancanti in base al metodo di aggiornamento incrementale
Principio del collettore G1 (punti chiave)
Principio di attuazione
n più regioni diverse
Set di memorie regionali (Remember Set)
Spiegazione dettagliata di Cardtable
Risolvi il problema della marcatura dell'edificio in base all'istantanea originale (satb)
Spiegazione dettagliata del garbage collector ZGC
Spiegazione dettagliata dei netturbini Epsilon e Shenandoah
algoritmo di copia spazzatura
Principio dell'algoritmo di marcatura a tre colori del meccanismo di raccolta dei rifiuti
Problemi multipli di etichettatura/etichettatura mancante causati dall'algoritmo di marcatura a tre colori
spazzatura galleggiante
Problema con l'offerta mancante
Soluzione dell'etichetta mancante dell'oggetto
Basato sul metodo di aggiornamento incrementale (CMS)
Basato sul metodo snapshot originale satb(G1)
Spiegazione dettagliata del set di memoria regionale (Remember Set) e del tavolo delle carte (Cardtable)
fermare il mondo
Perché si verifica il problema di fermare il mondo?
Come evitare il problema di fermare il mondo
Spiegazione dettagliata degli strumenti di ottimizzazione JVM
Spiegazione dettagliata dei comandi di ottimizzazione Jstat, Jinfo, Jmap, Jhat e Jstack di JDK
Spiegazione dettagliata degli strumenti di ottimizzazione Jvisualvm e Jconsole
Spiegazione dettagliata dell'uso dello strumento Alibaba arthas
Strumento di analisi del registro GC
Come leggere i dettagli del registro GC
Utilizzo dello strumento di analisi dei log GCEasy
Utilizzo dello strumento di analisi dei log GCViewer
Pratica di ottimizzazione dei parametri JVM
Impostazione e ottimizzazione dei parametri di raccolta dei rifiuti di vecchia generazione e di giovane generazione con memoria heap di progetto con traffico di 100 milioni di livelli
Ambiente di produzione online Strumento di monitoraggio dell'overflow della memoria OMM e soluzione di posizionamento
Pratiche di ottimizzazione su come ridurre i gravi GC completi negli ambienti di produzione online che portano a blocchi diretti del sistema
Sistema ad alta concorrenza, come evitare frequenti operazioni GC in un ambiente di produzione online
Sistema ad alta concorrenza, come ottimizzare il raccoglitore G1/CMS
Come impostare la dimensione della memoria iniziale dell'heap JVM per il servizio medio giornaliero di milioni di PV
Programmazione concorrente in pratica
Nozioni di base sul sistema operativo
Processo di passaggio dalla modalità utente alla modalità kernel
Gestione del modello di processo Linux
Principio di comunicazione tra processi di Linux
Principi di comunicazione di rete Linux
Nozioni di base sul multithreading
Avvio rapido con il multithreading
Cos'è un processo/thread
Il processo è la più piccola unità di allocazione delle risorse
Il thread è l'unità più piccola di esecuzione del programma
Scenari di applicazioni multi-thread
Sviluppo client (app mobile/).
Invia SMS/Invia e-mail in modo asincrono
Modificare il codice che richiede tempo per essere eseguito in esecuzione asincrona multi-thread.
Scrivi il log in modo asincrono
Download multithread
Differenza tra multithreading e threading singolo
Multithreading (esecuzione parallela)
Thread singolo (esecuzione sincrona)
Come comprendere il concetto di commutazione della CPU multi-thread
La CPU corrente passa all'esecuzione di un altro thread
È vero che più il multithreading è abilitato, meglio è?
Non necessariamente. L'apertura di troppi thread può facilmente causare il cambio di contesto della CPU.
La differenza tra thread utente e thread demone
Come interrompere con grazia un thread
Analisi di sette stati di multithreading
stato iniziale
stato pronto
Stato operativo
<font face="宋体"><span style="font-size: 14px;">Stato di morte</span></font><br>
stato di blocco
attesa del timeout
stato di attesa
Cinque modi per creare il multithreading
Eredita la classe Thread per creare un thread
Implementa l'interfaccia Runnable per creare un thread
Crea thread utilizzando Callable e Future
Utilizzare un pool di thread come il framework Executor
Crea un thread utilizzando l'annotazione asincrona @Async
Crea un thread utilizzando l'espressione lambda
Sicurezza del thread multi-thread
Qual è il problema di sicurezza del thread
Quando più thread scrivono sulla stessa variabile globale contemporaneamente, potrebbero subire interferenze da altri<br>thread, il che potrebbe portare a problemi di sicurezza del thread.
La differenza tra blocco e blocco sincronizzato
lock Acquisisce e rilascia manualmente i lock
Sincronizzato acquisisce e rilascia automaticamente i blocchi
SynchronizedJDK6 avvia il processo di aggiornamento automatico del blocco
L'implementazione sottostante del lock lock è basata sul lock aqs e richiede l'aggiornamento manuale del lock.
Problema di deadlock multi-thread
Come risolvere i problemi di deadlock con il multi-threading
jconsole.exe diagnostica il deadlock
Cause dei thread deadlock multi-thread
Sincronizzazione annidata nella sincronizzazione
Come risolvere i problemi di sicurezza dei thread (come garantire la sincronizzazione dei thread)
La sincronizzazione risolve i problemi di sicurezza dei thread
il codice di sincronizzazione sincronizzato è veloce
metodo dell'istanza modificata sincronizzata
metodo statico modificato sincronizzato
Il blocco del blocco risolve il problema di sicurezza del thread
Comunicazione tra più thread
attendere e avvisare
wait rilascia il blocco corrente e blocca il thread corrente
notify riattiva il thread bloccato
Il principio del metodo join
Lo strato inferiore è basato sull'incapsulamento di attesa
principio sincronizzato
Come è composto un oggetto
Intestazione dell'oggetto
Segna Parola
Codice hash (HashCode), età di generazione GC, flag di stato del blocco, blocco mantenuto dal thread, ID thread distorto, timestamp distorto
Puntatore classico<br>
Dati dell'istanza
proprietà dei membri
Allinea l'imbottitura
La dimensione dell'oggetto deve essere un multiplo intero di 8 byte. Se non è un multiplo intero di 8 byte, verrà allineato e riempito.
Processo di aggiornamento del blocco sincronizzato
blocco del pregiudizio
Il blocco e lo sblocco non richiedono un sovraccarico aggiuntivo. Sono adatti solo per lo stesso thread per accedere al blocco di codice sincronizzato senza sovraccarico aggiuntivo. Se più thread competono contemporaneamente, il blocco verrà revocato.
Chiusura leggera
I thread concorrenti non si bloccheranno, il che migliora la velocità di risposta del programma. Se il thread competitivo per il blocco non viene mai ottenuto, verrà utilizzato spin per consumare risorse della CPU. È adatto per situazioni in cui i blocchi di codice sincronizzati vengono eseguiti molto rapidamente rotazione dopo 7)
blocco del peso
La competizione tra thread non utilizza la rotazione, non consuma risorse della CPU ed è adatta all'esecuzione sincrona del codice per un tempo relativamente lungo.
Analisi sul principio del processo di espansione sincronizzata delle serrature
Blocco del bias(101)
1. Il thread corrente ottiene se si tratta di un lock parziale dal markword nell'intestazione dell'oggetto. Se è un lock parziale, determina se l'id del thread=== l'id del thread corrente.
2. Se è uguale all'ID del thread corrente, l'operazione CAS non verrà eseguita ripetutamente, ma entrerà direttamente nel nostro blocco di codice di sincronizzazione.
3. Se non è uguale all'ID del thread corrente, se è una situazione senza blocco e non ci sono altri thread in competizione con me, usa direttamente CAS per modificare lo stato di blocco in markword su 101 e memorizzare anche l'ID del thread corrente nel markword.
4. Altri thread iniziano a competere con il thread del bias lock Se il numero di cancellazioni del bias lock raggiunge 20, reindirizzeranno direttamente il bias lock al thread T2 in batch (nota: non ci sono altri thread in competizione con t2). il numero di cancellazioni del blocco bias raggiunge 20, 40 volte, l'annullamento batch inizierà più tardi.
5. Per annullare il blocco parziale, dobbiamo interrompere il thread di blocco parziale in un punto sicuro globale, modificare il nostro markword in un blocco leggero e riattivare il thread di blocco parziale.
6. Nota: JDK15 disattiva l'ottimizzazione del blocco parziale per impostazione predefinita.
Lucchetto leggero(000)
1. Se più thread competono per lo stesso blocco contemporaneamente, aggiorna il blocco leggero e utilizza CAS (modifica lo stato del blocco markword = 00, in caso di successo, sostituiscilo con markword e memorizza il valore HashCode direttamente nel nostro stack frame attualmente , L'indirizzo del record di blocco viene memorizzato in markword
2. Quando utilizziamo un blocco leggero per rilasciare il blocco, il contenuto del valore del markword viene ripristinato
Pesante (010) (Monitor C)
1. Se il nostro thread ha riprovato più volte e non ha ancora acquisito il blocco, il blocco corrente verrà aggiornato a un blocco pesante.
2.2. I thread che non hanno acquisito il blocco verranno archiviati nella raccolta EntryList dell'oggetto C Monitor. Allo stesso tempo, il thread corrente bloccherà e rilascerà direttamente i diritti di esecuzione della CPU il blocco nel periodo successivo è molto elevato perché è necessario che si verifichi il cambio del contesto della CPU. Passa dalla modalità utente al kernel e modifica il valore del markword nell'intestazione dell'oggetto in C Monitor. L'oggetto Java del puntatore dell'indirizzo di memoria è associato a C Monitor.
C Monitor Blocco del monitor (blocco pesante)
Monitor (blocco oggetto pesante)
ricorsioni (numero di ricorsioni/numero di rientri)
proprietario (registra l'ID del thread che attualmente detiene il blocco)
waitSet (i thread in attesa che il pool sia in stato di attesa verranno aggiunti a _WaitSet)
entryList (pool di blocco: i thread in attesa dello stato di blocco del blocco verranno aggiunti a questo elenco)
Quando il thread nel pool di attesa viene risvegliato, il blocco verrà acquisito immediatamente?
Dopo che il thread nel pool di attesa è stato risvegliato, il pool di attesa viene trasferito al pool di lock e messo in coda per competere nuovamente per il lock.
Blocca l'ingrossamento, l'eliminazione e l'ottimizzazione delle prestazioni
Irruvidimento delle serrature
Ogni filo mantiene il lucchetto per il minor tempo possibile
Eliminazione delle serrature
L'eliminazione dei blocchi è un metodo di ottimizzazione dei blocchi che si verifica a livello del compilatore
principio delle parole chiave volatili
proprietà delle parole chiave
Garantire visibilità
Disabilita il riordino
Nessuna garanzia di atomicità
modello di memoria Java
Analisi dell'architettura hardware multi-core della CPU
jmm otto specifiche di sincronizzazione
Protocollo di coerenza della cache volatile
serratura dell'autobus
Protocollo MESI
Il problema della falsa condivisione
Concetti base sulle linee cache
Piano di riempimento della banca
Perché è necessario aggiungere volatile al riordino/barriera della memoria/blocco del doppio controllo?
La differenza tra sincronizzato e volatile
Perché Volatile non garantisce l'atomicità
Classificazione dei lock simultanei
blocco pessimistico
chiusura ottimistica
blocco della rotazione
Blocco di rientro
serratura giusta
serratura ingiusta
interpretazione del codice sorgente aqs
Interpretazione del codice sorgente LockSupport
Interpretazione del codice sorgente AbstractQueuedSynchronizer
ReentrantLock/ReentrantReadWriteLock, interpretazione del codice sorgente ReadWriteLock
Interpretazione del codice sorgente Semaphore/CountDownLatch/CyclicBarrie
Come implementare lo strato inferiore di AQS
A.Cas garantisce la sicurezza del thread di AQS
B. L'elenco doppiamente collegato memorizza i thread bloccati
C.LockSupport blocca e riattiva i thread
attributi fondamentali
Valore statale dello Stato
Stato del nodo (waitStatus)
-2 Il thread corrente blocca e rilascia il blocco allo stesso tempo
-1 riattiva il thread dei nodi successivi<br>
Scenari applicativi AQS
L'implementazione sottostante di lock lock
Blocco giusto e blocco ingiusto
L'impostazione predefinita è il blocco ingiusto
Tempo di blocco della contesa
Fair lock: quando si compete per un lock, se il lock è già detenuto da un altro thread, verrà archiviato direttamente alla fine dell'elenco doppiamente collegato.
Lock ingiusto: quando si compete per un lock, se il lock è già detenuto da un altro thread, CAS verrà comunque riprovato.
Principi fondamentali della progettazione
metodo di blocco()
Utilizzare CAS per modificare il valore dello stato nella classe AQS da 0 a 1
Se la modifica va a buon fine (il blocco viene ottenuto con successo)
Se la modifica fallisce (impossibile ottenere il blocco)
Memorizzato nell'elenco doppiamente collegato AQS
metodo di sblocco()
Utilizzare CAS per modificare lo stato nella classe AQS da 0 a 1
Se il CAS ha successo
È necessario riattivare il thread memorizzato nella cache dal nodo successivo del nodo principale nell'elenco AQS doppiamente collegato
Domanda: perché lo sblocco rilascia il blocco e riattiva solo un thread anziché più thread?
Il livello inferiore utilizza un elenco collegato a due vie per archiviare i thread bloccati. Il costo per riattivare tutti i thread è molto elevato.
Non esiste un processo di aggiornamento del blocco nel blocco e gli sviluppatori devono espanderlo da soli.
Codice sorgente ConcurrentHashMap1.7 sottostante Lock
Condizione
Nota: condizione e blocco non utilizzano lo stesso elenco doppiamente collegato
Blocca il pool e attendi il pool
Pool di lock: si riferisce ai thread nel lock che non sono riusciti a competere per il lock e sono archiviati nell'elenco AQS doppiamente collegato.
Pool di attesa: si riferisce al thread corrente che chiama il metodo wait, rilascia attivamente il blocco (valore di stato aqs = 0) e lo memorizza nell'elenco doppiamente collegato del pool di attesa
Come riattivare il thread nella pool di attesa?
La chiamata a questo signal() trasferisce solo i nodi del nodo (thread) nel pool di attesa al pool di lock dell'elenco doppiamente collegato AQS per competere nuovamente per le risorse di lock.
Dopo aver chiamato signal() e chiamato il metodo di sblocco, i thread nel pool di wakeup lock iniziano a competere per le risorse di lock.
CountDownLatch(contatore)
Attraverso il costruttore new CountDownLatch(1)
L'implementazione sottostante basata su AQS imposta il valore dello stato nella classe AQS su 1
attendere il metodo
Memorizza il blocco di thread corrente nell'elenco AQS doppiamente collegato
conto alla rovescia
Azionare il valore di stato -1 nella classe AQS Se lo stato AQS viene modificato in 0, riattivare il thread memorizzato nell'elenco doppiamente collegato nella classe AQS.
Semaforo(Semaforo)
Attraverso il costruttore new Semaphore(3)
L'implementazione sottostante basata su AQS imposta il valore dello stato nella classe AQS su 3
L'operazione sottostante dell'acquisizione è modificare il valore di stato -1 nella classe AQS Se il valore di stato nella classe AQS viene modificato in 0, il thread corrente deve essere bloccato e archiviato nell'elenco doppiamente collegato nella classe AQS.
Lo strato inferiore del rilascio opera sullo stato 1 nella classe AQS<br>
Sveglia contemporaneamente i thread bloccati nella classe AQS (ne verrà svegliato solo uno)
CyclicBarrier (barriera di sincronizzazione)
Attraverso il costruttore new CyclicBarrier(2)<br>
Il livello inferiore assegna un valore = 2 all'attributo di conteggio CyclicBarrier
La chiamata attende lo strato inferiore
Operazione su CyclicBarrier count-1
conteggio=0
Continua l'esecuzione e riattiva tutti i thread nel pool di attesa
contare!=0
Conservato nel pool di attesa
Operazioni atomiche simultanee
Classe atomica
Principio CAS (bloccaggio ottimistico).
Spiegazione dettagliata della classe magica non sicura
Principio di Blocking QueueBlockingQueue
Blocco della classificazione delle code
ArrayBlockingQueue coda delimitata dall'array
Coda delimitata dell'elenco collegato ConcurrentLinkedQueue
PriorityBlockingQueue coda illimitata con ordinamento per priorità
DelayQueue ritarda la coda illimitata
Applicazione quadro
Pool di thread scritti a mano basati su BlockingQueue
Middleware di messaggi scritti a mano basato su BlockingQueue
Framework di registro scritto a mano basato su BlockingQueue
Spiegazione dettagliata del pool di thread dell'esecutore e analisi del codice sorgente principale
Perché utilizzare il pool di thread
Riutilizzabilità
Gestione unificata
Migliora la risposta
Quattro modi per creare un pool di thread
newCachedThreadPool(); Pool di thread memorizzabili nella cache
newFixedThreadPool(); può essere fissata in lunghezza e limitare il numero massimo di thread
newScheduledThreadPool(); può essere pianificato
newSingleThreadExecutor();
Il livello inferiore reale è basato sul pool di thread di incapsulamento del costruttore ThreadPoolExecutor
Analisi dei principi fondamentali del pool di thread
LinkedBlockingQueue
modello di produttore e consumatore
Perché Alibaba sconsiglia l'uso degli esecutori
L'utilizzo sottostante della coda illimitata LinkedBlockingQueue è soggetto a overflow della memoria
Cosa fare se la coda del pool di thread è piena
Negare la politica
AbortPolicy elimina le attività e genera eccezioni di runtime
Attività di esecuzione CallerRunsPolicy
DiscardPolicy Ignora, non accadrà nulla
DiscardOldestPolicy esce dalla coda ed entra per primo nella coda.
Implementa l'interfaccia RejectedExecutionHandler e personalizza il processore
Come configurare correttamente i parametri del pool di thread
Utilizzo intensivo della CPU
Numero ottimale di thread = numero di core della CPU o numero di core della CPU ±1
Intensivo
Numero ottimale di thread = ((tempo di attesa del thread, tempo della CPU del thread)/tempo della CPU del thread) * numero di CPU
Come personalizzare il pool di thread in base a ThreadPoolExecutor
Interpretazione del codice sorgente FutureTask
Implementazione di FutureTask basata su LockSupport
Implementazione di FutureTask basata su Wait/Notify
Interpretazione del codice sorgente di ForkJoin
Sviluppo della programmazione concorrente
meccanismo di furto del lavoro
Principio di unione a forcella
Interpretazione del codice sorgente threadlocale
Cos'è Threadlocal
Scenari applicativi threadlocal
1.Classe del modello di transazione primaverile
2. Ottieni httprequest
3.La catena di chiamate Aop passa i parametri
La differenza tra Threadlocal e Synchronized
Come prevenire perdite di memoria Threadlocal
1. Chiama il metodo di rimozione
2. Quando si utilizza il metodo set, verrà cancellato che la chiave precedente era nulla.
Interpretazione del codice sorgente del framework di microservizi
Interpretazione del codice sorgente SpringBoot
Come funziona la configurazione automatica di SpringBoot
Interpretazione del codice sorgente del modulo principale SpringBoot
Interpretazione del codice sorgente delle annotazioni principali di SpringBoot
Interpretazione del codice sorgente del contenitore Servlet incorporato SpringBoot
Distribuzione del pacchetto SpringBoot e gestione del funzionamento e della manutenzione
Come i contenitori servlet superano Webflux
Interpretazione del codice sorgente del componente principale SpringCloudNetfilix (prima generazione).
Registrazione del servizio Eureka e interpretazione del codice sorgente di discovery
Rinnovo del servizio Eureka (heartbeat)
Eliminazione del servizio lato server Eureka
Meccanismo di autotutela del servizio Eureka
E se il servizio dovesse interrompersi?
I servizi locali utilizzano un meccanismo di tentativi
Il servizio locale implementa il failover degli indirizzi
Notifica offline del servizio Eureka
Sincronizzazione dei dati del cluster Eureka
Interpretazione del codice sorgente della chiamata del servizio dichiarativo Fegin
Hystrix implementa la limitazione della corrente di servizio, il downgrade e l'interpretazione del codice sorgente dell'interruttore
Spiegazione dettagliata del gateway unificato Zuul, del routing dei servizi, dell'interpretazione del codice sorgente del filtro
Interpretazione del codice sorgente del centro di configurazione distribuito Config
Sleuth ha distribuito il monitoraggio dei collegamenti, l'interpretazione del codice sorgente
Spiegazione dettagliata del bilanciamento del carico del client della barra multifunzione e analisi del codice sorgente
Interpretazione del codice sorgente SpringCloudAlibaba (seconda generazione).
Interpretazione del codice sorgente del centro di registrazione distribuito Nacos
Registrazione e scoperta del servizio
Registrazione del servizio Nacos e interpretazione del codice sorgente di rilevamento
Principio di registrazione del servizio
eurekaClient
Utilizza jerseyClient per inviare una richiesta di registrazione
Lato eurekaServer
Utilizza ConcurrentHashMap per memorizzare nella cache gli indirizzi dell'interfaccia
key è il nome del servizio
value è l'indirizzo dell'interfaccia della cache
Servizio Naocs di rilevamento del battito cardiaco e di interpretazione del codice sorgente di rinnovo
Per impostazione predefinita, EurekaClient invia un pacchetto di rinnovo heartbeat ogni 30 secondi per estendere il tempo e comunicare a EurekaServer che sono ancora vivo.
Per impostazione predefinita, EurekaServer cerca gli indirizzi scaduti nell'indirizzo della cache ogni 60 secondi, li memorizza in una nuova raccolta e utilizza un algoritmo casuale per cancellarli.
Servizio Naocs offline e interpretazione del codice sorgente per il controllo dello stato
Interpretazione del codice sorgente dell'algoritmo di elezione del cluster Nacos Raft
Meccanismo di elaborazione del polling lungo del server Nacos
Principio di sincronizzazione dei dati tra i nodi del cluster Nacos
Interpretazione del codice sorgente della modalità AP in Nacos
Interpretazione del codice sorgente della modalità CP in Nacos
Soluzione split-brain del cluster Nacos
Centro di configurazione distribuito
Principio di implementazione del centro di configurazione distribuito Nacos
Come aggiornare dinamicamente i file di configurazione in Nacos
Gateway Interpretazione del codice sorgente del gateway di microservizi di nuova generazione
Perché le prestazioni del Gateway sono migliori delle prestazioni di Zuul?
Analisi del codice sorgente del routing dinamico del gateway
Specificare il percorso corrispondente alla regola temporale
percorso di corrispondenza dei cookie
Percorso di corrispondenza dell'intestazione
Percorso corrispondente all'host
Richiedi il percorso corrispondente al metodo
Richiedi percorso corrispondente al percorso
Analisi del codice sorgente del filtro gateway
Filtro gateway personalizzato
Gateway integra Nacos per ottenere il bilanciamento del carico
Il gateway integra Sentinel per implementare la limitazione della corrente del gateway
Interpretazione del codice sorgente del framework delle transazioni distribuite Seata
Interpretazione del codice sorgente dei tre componenti principali di Seata per risolvere transazioni distribuite
Seata genera in modo inverso un'istruzione SQL basata sulla tabella undo_log e ripristina l'interpretazione del codice sorgente
Interpretazione del codice sorgente della progettazione del blocco globale della transazione del ramo Seata
Interpretazione del codice sorgente GlobalTransactionalInterceptor
Come TM si connette in remoto a TC per ottenere l'interpretazione del codice sorgente dell'ID transazione globale
Interpretazione approfondita del codice sorgente del codice sorgente degli specchietti anteriori e posteriori Seata
Quali sono le differenze tra il rollback di Seata e LCN?
Interpretazione del codice sorgente del framework di sincronizzazione dei dati distribuiti del canale
Interpretazione del codice sorgente dell'architettura complessiva del canale
Analisi dell'architettura del principio di replica master-slave di MySQL
Come Canal finge di iscriversi ai file BinLog dai nodi
Principi di progettazione EventParser e EventSink
Principio di progettazione dell'abbonamento/consumo incrementale del canale
Ottimizzazione delle prestazioni di sincronizzazione dati simultanea del canale
Come ridurre la latenza di sincronizzazione tra i dati
Come evitare la coerenza della sequenza dei messaggi di sincronizzazione dei dati
Come evitare il problema della perdita di sincronizzazione dei dati
Sentinella
isolamento del servizio
Algoritmo di limitazione della corrente
secchio di gettoni
secchio che perde
Implementato in base al semaforo Semaforo
Finestra di conteggio fissa
finestra con tecnologia scorrevole
Regole di controllo del flusso
Discussioni
Implementato in base al semaforo Semaforo
QPS
secchio di gettoni
Hystrix
Regole di controllo del flusso
Isolamento del semaforo
Nella Sentinella
QPS
secchio di gettoni
Isolamento del pool di thread
I difetti consumano risorse della CPU
Metodo di limitazione della corrente
Google Guava (RateLimiter)
Sentinella di Alibaba
Nginx
Redis lua implementa la limitazione di corrente
Si consiglia di eseguire la limitazione della corrente su nginx o gateway
Interpretazione del codice sorgente del framework della raccolta
Hash (funzione hash) Interpretazione del codice sorgente del framework della raccolta di mappe
conoscenza di base
La differenza tra == e equals e l'implementazione sottostante
Perché riscrivere uguale e riscrivere anche l'hashcode
Conversione binaria e decimale/^ (operazione OR esclusivo)/>>> (spostamento a destra senza segno)/ & (operazione AND)
Implementazione di basso livello
JDK1.7
Elenco collegato di array
Metodo di inserimento della testina (problema del loop infinito di espansione simultanea)
Scrivere il codice è semplice
JDK1.8
Elenco collegato di array albero rosso nero
metodo di inserimento della coda
Scrittura di codice di fascia alta
Conversione dell'albero rosso-nero
(Capacità dell'array >= 64 e lunghezza dell'elenco collegato maggiore di 8)
Numero di nodi dell'albero rosso-nero <6 elenco collegato di conversione
Calcolo della funzione hash
(h = chiave.hashCode()) ^ (h >>> 16)
i = (n - 1) & hash
complessità temporale
La chiave non è in conflitto
La complessità temporale è O(1)
Conflitto chiave
L'archiviazione dell'elenco collegato è O(N)
La memorizzazione dell'albero rosso-nero è O(LogN)
problema di collisione dell'hashcode
I valori dell'hashcode sono gli stessi ma i valori del contenuto sono diversi.
Caratteristiche:
La chiave è null per memorizzare la posizione 0 dell'array.
Implementato utilizzando un elenco collegato unidirezionale
Archiviazione hash non ordinata
Ottimizzazione delle prestazioni
Come evitare problemi di perdita di memoria con HashMap
In che modo HashMap riduce la probabilità di conflitti Hash
Come specificare ragionevolmente la dimensione del valore iniziale della raccolta in HashMap
Domande comuni sull'intervista su HashMap
Perché dovremmo riscrivere il metodo HashCode quando riscriviamo Equals?
Come HashMap evita problemi di perdita di memoria
Come viene implementato il livello inferiore di HashMap1.7?
Dove è archiviato il valore null HashMapKey?
Come viene implementato il livello inferiore di HashMap1.7?
Dove è archiviato il valore null HashMapKey?
Come HashMap risolve il problema del conflitto Hash
Come implementare il problema di espansione dell'array con HashMap
Il livello inferiore di HashMap utilizza un elenco collegato singolo o un elenco collegato doppio?
Complessità temporale della query HashMap in base alla chiave
Quali sono le differenze tra HashMap1.7 e 1.8?
Come evitare il problema del loop infinito dell'espansione multi-thread in HashMap1.8
Perché HashMap1.8 deve introdurre alberi rosso-neri?
Perché il fattore di caricamento è 0,75 anziché 1
In che modo il livello inferiore di HashMap riduce la probabilità di conflitti Hash?
In che modo HashMap memorizza 10.000 chiavi in modo più efficiente?
Quali sono i vantaggi dei bit alti e bassi e delle operazioni modulo di HashMap?
Perché non utilizzare semplicemente la chiave come valore hash ma eseguire un'operazione XOR con i 16 bit alti?
Come viene implementata la funzione hash in HashMap?
Il livello inferiore di HashMap è archiviato in ordine? <br>
In che modo gli strati sottostanti di LinkedHashMap e TreeMap ottengono l'ordinamento?
Come utilizzare HashMap in situazioni di elevata concorrenza
Il principio alla base dell'implementazione di ConcurrentHashMap
Interpretazione del codice sorgente del framework della raccolta ConcurrentHashMap
conoscenza di base
sincronizzato e bloccato
Come comprendere il concetto di blocco della segmentazione
Algoritmo CAS e volatile
implementazione sottostante
JDK1.7
struttura dati
Blocco della segmentazione dei segmenti dell'array Implementazione dell'elenco collegato HashEntry
Blocca l'implementazione
Blocco blocco CAS blocco ottimistico classe UNSAFE
Implementazione dell'espansione della capacità
Supporta l'espansione simultanea di più segmenti
Jdk1.8
struttura dati
Utilizza direttamente l'array Node per salvare i dati
Elenco collegato di array albero rosso nero
Blocca l'implementazione
Annulla la progettazione del segmento del segmento
L'indice non è in conflitto e utilizza il blocco cas
I conflitti di indice utilizzano sincronizzato
Implementazione dell'espansione della capacità
Supporta l'espansione simultanea
Caratteristiche: Supporta multi-threading, alta efficienza, diviso in 16 segmenti per impostazione predefinita
Caratteristiche:
ConcurrentHashMap non supporta la chiave nulla
Analisi del codice sorgente della raccolta di elenchi
Implementazione sottostante dell'arraylist
struttura dati
vettore
complessità temporale
Complessità del tempo di query dell'indice o(1)
Espansione
L'espansione è 1,5 volte l'originale
Non thread-safe
Vantaggi e svantaggi
L'efficienza di aggiunta ed eliminazione è bassa e richiede espansione, ma l'efficienza delle query è relativamente elevata.
Implementazione vettoriale sottostante
struttura dati
vettore
complessità temporale
Complessità del tempo di query dell'indice o(1)
Espansione
L'espansione è 2 volte l'originale
Sicurezza del filo
Implementazione sottostante LinkedList
Basato sulla struttura dei dati dell'elenco collegato, complessità del tempo di query dell'indice ()
struttura dati
lista collegata
complessità temporale
Complessità del tempo di query dell'indice log2(n) ricerca binaria
Non thread-safe
Vantaggi e svantaggi
L'efficienza di aggiunta, eliminazione e modifica è elevata, ma l'efficienza delle query è relativamente bassa.
Soluzioni di architettura distribuita
Progettazione e pratica dell'architettura idempotente dei microservizi Internet
Cos’è il design idempotente? Background di produzione idempotente
Timeout della risposta del client
Quando il tempo di esecuzione aziendale è molto lungo, è consigliabile utilizzare invece mq asincrono.
riprovare la politica
Risolvere le ragioni principali del problema idempotente delle interfacce di servizio
livello di banca dati
Analizzare le ragioni dell'idempotenza a livello architetturale
strato di ingresso
strato di interfaccia
Interrogare in anticipo se la logica aziendale è stata eseguita in base all'ID globale
Livello DB
inserire il vincolo di annotazione univoca del tipo
meccanismo di blocco ottimistico del tipo di aggiornamento
L'ID globale garantisce davvero l'idempotenza dell'interfaccia?
Non necessariamente, è necessario considerare il livello del database
Come garantire l'idempotenza delle interfacce RPC
identificativo globale
Meccanismo di bloccaggio (non consigliato a causa della bassa efficienza)
Implementa una progettazione idempotente basata su scenari aziendali reali
Progettazione e pratica dell'architettura di blocco distribuito su Internet
Quali scenari utilizzano i blocchi distribuiti?
Il problema di garantire l'idempotenza della pianificazione delle attività pianificate
Vendite flash garantite per evitare problemi di vendita eccessiva
Il principio essenziale di implementazione dei lock distribuiti
Riprovare la strategia
Adatto per l'esecuzione di affari molto veloce
Controllo del timeout
Progettazione dell'estensione della vita
Come evitare problemi di stallo quando si continua a vivere
Ottimizzazione delle prestazioni
Consideriamo l'effetto gregge
Alta disponibilità
Imposta il timeout di blocco
Granularità del blocco ridotta
equità
Test di compatibilità dei blocchi distribuiti e progettazione del ripristino
Soluzione di implementazione del blocco distribuito
Zookeeper implementa blocchi distribuiti (modalità CP)
idea principale
Nodo temporaneo
unicità del percorso
evento dell'osservatore
Caratteristiche
Utilizza la modalità cp
vantaggio
Soluzione congenita al problema del cervello diviso (più della metà del meccanismo)
Più affidabile e stabile
discordanza
L'efficienza dei dati di sincronizzazione del cluster è bassa
Prestazioni basse
Due metodi di implementazione
Implementato in base allo stesso nodo temporaneo
Potrebbe verificarsi un effetto gregge
Implementato in base a nodi sequenziali temporanei
Evita problemi di pastorizia
Nodo di numeri sequenziali temporanei
Se il nodo corrente è il nodo più piccolo, significa che il lock è stato acquisito con successo.
Se il nodo corrente non è il nodo più piccolo, iscriviti al nodo precedente
Blocco distribuito del framework curatore
Ottieni la serratura
Implementazione basata su nodi di numerazione sequenziale temporanea
Crea un nodo di sequenza temporaneo e chiunque sia il più piccolo acquisirà il lucchetto.
bloccare
L'attuale nodo della sequenza temporanea creato da te non è il più piccolo, iscriviti al nodo precedente
serratura di rilascio
Elimina il nodo del numero sequenziale temporaneo
Difficoltà nell'intervista
Come funziona il nodo master zk e quali sono gli impatti?
Si verifica la rielezione ZK e l'intero ambiente ZK è temporaneamente non disponibile.
È necessario considerare il protocollo zab
Confronta prima zxid, quindi confronta myid
Come evitare il problema del deadlock del client zk
zkserver è inattivo
Il client zk imposta il timeout di blocco
Dopo aver monitorato l'arresto anomalo dello zk, si è risvegliato automaticamente.
il client zk è inattivo
Le caratteristiche innate di zk evitano problemi di deadlock e rilasciano proattivamente i lock
Altri client zk impostano il timeout di blocco
La JVM che ha acquisito il blocco non rilascia mai il blocco.
Controlla il numero di estensioni della durata, rilascia attivamente il blocco dopo più estensioni della durata e la transazione verrà annullata
Redis implementa il blocco distribuito (modalità AP)
idea principale
Setnx implementa il blocco distribuito
Ottieni la serratura
Più jvms setnx contemporaneamente. Alla fine, solo un jvm riesce
serratura di rilascio
Elimina la chiave
Caratteristiche
Utilizza la modalità AP
vantaggio
Supporta un'elevata concorrenza
L'efficienza va bene
Utilizzando il metodo dei dati di sincronizzazione asincrona
discordanza
Problema congenito del cervello diviso (il cluster Redis non ha un meccanismo di maggioranza)
Non molto stabile
Il thread singolo congenito di Redis può garantire problemi di sicurezza del thread setnx
Quadro Redisson
Ottieni la serratura
Crea una chiave hash utilizzando lo script lua
serratura di rilascio
Elimina la chiave
Progettazione dell'estensione della vita
Per impostazione predefinita, il thread del watchdog viene attivato ogni 10 secondi per impedire la scadenza della chiave.
Difficoltà nell'intervista
Come evitare problemi di deadlock del client
Imposta chiave scaduta
Limita il numero di estensioni della vita
Transazione di ripristino
La chiave è scaduta, ma l'attività non è stata ancora eseguita. Cosa devo fare?
Progettazione dell'estensione della vita
Estensione della vita globale (non consigliato)
Estensione incrementale della vita (consigliata)
Per impostazione predefinita, la durata viene rinnovata in anticipo ogni 10 secondi per evitare la scadenza della chiave.
Rinnova la vita più volte per limitare il numero di rinnovi della vita a causa di problemi di stallo
Transazione di ripristino
Rilasciare attivamente il blocco
Nel cluster Redis, cosa devo fare se il nodo master è inattivo? <br>
Utilizza l'algoritmo di blocco rosso RedLock
Non esiste alcuna distinzione tra master e slave nel cluster Redis
Il client soddisfa più della metà dei requisiti setnx per più server Redis e acquisisce con successo il blocco.
Se il client imposta il tempo totale impiegato per ottenere il blocco > la scadenza della chiave, il blocco verrà rilasciato automaticamente.
Questo algoritmo utilizza effettivamente ZK per implementare blocchi distribuiti.
Progettazione e pratica dell'architettura delle transazioni distribuite su Internet
Lo sfondo delle transazioni distribuite
Singolo progetto più origini dati
jta Atomikos risolve transazioni distribuite
Interfaccia di chiamata remota RPC
Protocollo di coerenza delle transazioni distribuite
Protocollo di forte coerenza
Nel cluster, i dati di copia di ciascun nodo devono essere coerenti
Protocollo di coerenza debole
Nel cluster, alcune repliche dei nodi possono avere dati incoerenti
eventuale protocollo di coerenza
Sono consentiti brevi ritardi nei dati, ma alla fine è necessaria la coerenza dei dati
Idee per la progettazione di transazioni distribuite
Teoria della base e della PAC
Teoria delle basi
Fondamentalmente disponibile<br>
stato molle
eventuale consistenza
CAP
Teoria di base
Coerenza(C)
Nel cluster, i dati di copia di ciascun nodo devono essere coerenti
Disponibilità(A)
Dopo che alcuni nodi del cluster si sono guastati, l'intero cluster può ancora rispondere alle richieste di lettura e scrittura del client?
Tolleranza partizione (P)
La tolleranza agli errori di partizione (P) rappresenta principalmente errori causati da fluttuazioni della rete, che sono inevitabili, e queste tre modalità non possono essere raggiunte contemporaneamente, quindi attualmente esistono solo due modalità: modalità CP e AP
Selezione della modalità
CP (coerenza dei dati garantita)
Disponibilità non garantita
Ap (disponibilità garantita)
Tuttavia, la coerenza dei dati di ciascuna copia non può essere garantita<br>
Analisi comparativa
Nacos
Nacos supporta i cluster in modalità mista CP/AP a partire dalla versione 1.0. Per impostazione predefinita, la modalità Ap
Eureka
Modalità Ap
Guardiano dello zoo
Modalità CP
Il centro di registrazione consiglia la modalità Ap
Affari flessibili e rigidi
Le transazioni rigide soddisfano la teoria ACID
Le transazioni flessibili soddisfano la teoria BASE (sostanzialmente disponibile, eventualmente coerente)
2PC/3PC/TCC<br>
Quadro di risoluzione delle transazioni distribuite
LCN risolve i problemi delle transazioni distribuite
Seata risolve i problemi delle transazioni distribuite
MQ risolve i problemi delle transazioni distribuite
TCC risolve i problemi delle transazioni distribuite
Riprova il metodo di callback per risolvere i problemi di transazione distribuita<br>
Progettazione e pratica dell'architettura di pianificazione delle attività distribuite su Internet
Svantaggi delle attività pianificate tradizionali
Consuma risorse della CPU
Il non disaccoppiamento influisce sulla logica aziendale
Idee fondamentali per la progettazione della pianificazione distribuita delle attività
Tracciabilità dei registri
Espansione e contrazione flessibili
Supporta la pianificazione parallela
Strategia ad alta disponibilità
Strategia di gestione dei guasti
Strategia di sharding dinamica
Framework di pianificazione delle attività distribuite
Interpretazione del codice sorgente XXLJob
Interpretazione del codice sorgente ElasticJob
protocollo di coerenza dei dati mysql e Redis
soluzione
1. Aggiorna i dati mysql e svuota manualmente la cache Redis
Vantaggi: bassa latenza
Svantaggi: non disaccoppiato
2. Aggiorna i dati mysql e sincronizza i dati su Redis sotto forma di mq asincrono
Vantaggi: implementare il disaccoppiamento, riprovare la strategia di compensazione, migliorare la risposta dell'interfaccia
Svantaggi: alta latenza
3. Sincronizzazione dei dati su Redis in base alla sottoscrizione a MySQLBinLog combinata con il modulo asincrono mq (implementazione del framework del canale)
Vantaggi: maggiore disaccoppiamento, strategia di compensazione dei tentativi, migliore risposta dell'interfaccia
Svantaggi: la latenza aumenta sempre di più
Idee progettuali fondamentali
L’idea della coerenza finale è che è consentita l’incoerenza temporanea dei dati, ma i dati finali devono essere coerenti.
Principio del protocollo di coerenza a doppia scrittura
Elimina prima la cache e poi aggiorna il db (non consigliato)
È necessario ritardare la doppia eliminazione, eliminare due volte
Elimina prima la cache
La seconda volta, per evitare la concorrenza di altri thread, sincronizzare i dati di lettura sporca su Redis, quindi ritardare di alcuni secondi (il momento in cui il secondo thread business aggiorna i vecchi dati su Redis) per eliminare la cache
Aggiorna prima il db, quindi elimina la cache
Deve essere combinato con mq e garantire la coerenza della sequenza dei messaggi. L'eliminazione della cache deve avere esito positivo.
Protocollo di coerenza DoubleWrite
Cos'è la doppia scrittura
Aggiorna prima il db, quindi aggiorna la cache
Quali problemi sorgeranno
In una situazione simultanea, più thread scrivono contemporaneamente. Un altro thread potrebbe scrivere dati di lettura sporca nella cache.
Come risolvere le letture sporche
Utilizzando il meccanismo di blocco della riga della transazione mysql, più thread scrivono operazioni contemporaneamente. Alla fine, solo un thread acquisisce il blocco della riga Dopo aver acquisito il blocco della riga, Redis deve essere sincronizzato correttamente prima che il blocco della riga possa essere rilasciato i thread possono scrivere
Implementato utilizzando blocchi distribuiti (non consigliato, può essere implementato direttamente in base ai blocchi di riga mysql)
Principio di progettazione del telaio del canale
canal risolve il principio della sincronizzazione dei dati tra mysql e Redis
1.canal si maschera da nodo slave mysql e si iscrive al file binlog del nodo master mysql;
2. Quando il file binlog del nostro nodo master mysql cambia, il file binlog<br> viene inviato al server del canale;
3. Il canal server converte il file binlog in formato json e lo invia al canal client;
4. Il client del canale sincronizza i dati con Redis/ES;
modalità di sincronizzazione del canale
tcp (bassa efficienza)
kafka (consigliato)
Come migliorare l'efficienza del canale integrando la sincronizzazione dei dati Kafka
Integra la modalità argomento MQ
Argomento singolo e partizione singola (ordine rigoroso del binlog globale)
La partizione singola multiargomento può garantire l'ordinamento a livello di tabella.
Lo stesso nome di tabella viene inserito nella stessa partizione ed eventualmente utilizzato dallo stesso consumatore.
Argomento singolo, partizione multiargomento combinata con modalità hash
Come risolvere il problema della coerenza della sequenza dei messaggi
Imposta più partizioni e calcola l'hash in base ai campi nella tabella come l'ID della chiave primaria. Lo stesso ID verrà inserito nella stessa partizione e utilizzato dallo stesso consumatore.
C'è qualche ritardo nella sincronizzazione dei dati tra mysql e redis?
Durante il processo di sincronizzazione dei dati si verificherà un breve ritardo, il che è normale. È difficile raggiungere una forte coerenza e seguire l’idea di una coerenza finale.
Principio del middleware di messaggistica distribuito
Modello concettuale base MQ
Sincrono e asincrono
Ritaglio dei picchi di traffico
Scalabilità/disaccoppiamento
Buffering/recuperabilità
produttori e consumatori
Soluzioni comuni MQ
Come MQ evita l'accumulo di messaggi
Aumentare il tasso di consumo (cluster)
I consumatori ricevono messaggi in batch
In che modo MQ evita il consumo ripetuto da parte dei consumatori (problema idempotente)
Lo scenario aziendale dell'ID globale garantisce l'unicità
In che modo MQ garantisce che i messaggi non vadano persi?
Meccanismo di conferma del messaggio
Persistenza
messaggio di risposta
Come MQ garantisce la coerenza della sequenza dei messaggi
Associa lo stesso consumatore e la stessa coda
Modello di architettura push and pull MQ
Come i produttori ottengono i risultati di consumo
Restituisce in modo asincrono un ID globale e il front-end utilizza Ajax per eseguire query attive regolarmente.
Quadro MQ tradizionale
conigliomq
Pensieri architettonici
Centro della piattaforma di gestione Rabbitmq
Host virtuali
Archivia le code di messaggi in percorsi di sviluppo del team separati
Scambio
messaggio di distribuzione del percorso
chiave di instradamento
Modello di coda RabitMQ
modalità semplice<br>
modalità Lavoro
Modalità trasmissione --- fanout
Modalità di routing --diretto
Modalità tema --argomento
RabitMQ quattro tipi di interruttori
Scambio diretto (scambio diretto)
Scambio di fan-out
Scambio di argomenti
Scambio di intestazioni
Domande comuni sull'intervista su RabbitMQ
In che modo RabbitMQ garantisce che i messaggi non vadano persi
produttore
Assicurarsi che il produttore consegni correttamente il messaggio al server MQ
Meccanismo di conferma del messaggio di conferma (Conferma)
Forma sincrona o asincrona
Messaggi di transazione
consumatore
Modalità scontrino manuale dei consumi
Firma automatica (non consigliata)
Firma manuale (consigliata)
Persistenza dei messaggi lato server MQ
Coda di lettere non recapitate RabbitMQ
Il messaggio viene recapitato a MQ e archiviato. Il messaggio è scaduto.
Il contenitore della coda è pieno
Se il consumatore non riesce a consumare più messaggi, verrà trasferito nella coda dei messaggi non recapitati.
Meccanismo di ripetizione automatica dei messaggi RabbitMQ
Cosa devo fare se continuo a fallire dopo aver provato più volte?
Passa alla coda delle lettere non recapitate
Registrare nella tabella di registro la compensazione programmata o la compensazione manuale
Come evitare i problemi di idepotenza del consumatore?
Lo scenario aziendale dell'ID globale garantisce l'unicità
Kafka
Modello di progettazione dell'architettura principale di Kafka
Broker (lato server MQ)
Argomento (gli argomenti sono classificati in base all'attività)
Partiiton (messaggio di archiviazione della partizione)
Produttore
Consumatore
Gruppo di consumatori
Replica (meccanismo di replica)
Offset (record consumi)
Perché Kafka può supportare un'elevata concorrenza
livello della struttura di archiviazione
I messaggi verranno compressi per ridurre la larghezza di banda di trasmissione
modello di struttura di archiviazione della partizione della partizione kafka
File dei messaggi di archiviazione .log
.index memorizza l'indice del messaggio
.timeIndex, file dell'indice temporale
Registro di archiviazione segmentato (file di segmenti)
Utilizza un indice sparso per trovare la posizione fisica del messaggio (non viene creato alcun indice per ciascun messaggio)
Vantaggi: Risparmia spazio
Una volta archiviato, il messaggio non verrà eliminato immediatamente dopo il corretto utilizzo. Il messaggio viene ottenuto in base all'offset (è necessario considerare la configurazione della strategia di pulizia del registro).
livello dell'applicazione Java
produttore
I produttori consegnano i messaggi in batch (progettazione del pool di buffer)
consumatore
I consumatori ricevono messaggi in batch (offset multipli)
Un consumatore per partizione (scalabilità)
livello del kernel Linux
Utilizzare la lettura e la scrittura sequenziale
Utilizzare il meccanismo di copia zero
sendfile mmap modalità utente e mappatura della modalità kernel
Non è necessario che la CPU copi i dati
Ridurre il numero di passaggi tra la modalità utente e la modalità kernel
Utilizza Page Cache per migliorare la lettura e la scrittura
È necessario considerare il problema della spazzolatura del disco
Come Kafka garantisce messaggi affidabili
Replica
Meccanismo affidabile di replica ISR
Elezione replica nella partizione
HW high water mark: il massimo compenso che i consumatori possono consumare
Il valore di offset più grande nella coda LEO
Il produttore consegna la conferma del messaggio
0 significa che il produttore non aspetta (i messaggi potrebbero andare persi)
1 significa che il produttore è in attesa e il leader sta svuotando il disco (configurazione predefinita consigliata)
-1 significa che il produttore deve attendere che tutti i nodi siano sincronizzati.
Principio elettorale di Kafka Principio del controllore
Affidarsi ai nodi temporanei di Zookeeper per implementare le elezioni
Il consumatore invia manualmente la compensazione
Come fa Kafka a trovare il messaggio con un offset specificato?
1. Cerca file di segmenti di segmento in base all'offset (ricerca binaria)
2. Accedere al file indice (indice sparse) e trovare la posizione di archiviazione fisica corrispondente
3. In base alla posizione di accesso fisico, accedere al registro per trovare il messaggio fisico corrispondente.
Trova il valore dell'indice del messaggio
Restituisci direttamente i messaggi fisici (complessità temporale o(1))
Il valore dell'indice del messaggio non è stato trovato
Ricerca in sequenza (complessità temporale o(N))
Ottimizzazione delle prestazioni di Kafka
produttore
Dimensioni del buffer di memoria del produttore
Criteri di ripetizione "retries" e "retries.backoff.ms"
Questo parametro imposta il numero di tentativi e l'intervallo.
Meccanismo di conferma: acks Si consiglia di impostarlo su 1 per il saldo
consumatore
Il numero di partizioni consumer
I consumatori ricevono messaggi in batch in base a più offset
Il consumatore abilita l'invio manuale della compensazione
Broker (lato server MQ)
Configurazione dei criteri di conservazione dei log
Strategia di svuotamento dei file di dati di registro
configurazione della replica di replica
Ottimizzazione della configurazione dei thread di rete e IO
Ottimizzazione pratica delle prestazioni di MySQL
Ottimizzazione delle prestazioni di MySQL
Architettura MySQL e principi del processo di esecuzione
Come vengono eseguite le istruzioni SQL
Cache delle query integrata
Analisi grammaticale e lessicale
processore semantico
Piano di ottimizzazione/esecuzione
motore di esecuzione delle query
Struttura della memoria InnoDb e struttura del disco
Progettazione del buffer
Funzione Buffer Pool
Il buffer di memoria è pieno, cosa fare?
Come configurare la dimensione del buffer pool?
Problemi di latenza di MySQL e strategie di svuotamento dei dati
Come comprendere l'unità di pagina di dati astratti in MySQL
In che modo le pagine di dati e le pagine della cache su disco corrispondono tra loro?
Quali sono le informazioni descrittive corrispondenti alla pagina della cache?
Come impostare il buffer pool in modo appropriato in base alla configurazione della macchina
Quanta memoria dovrebbe essere impostata per il pool di buffer in un ambiente di produzione?
Dimensione totale = 2 volte (dimensione del blocco * numero di pool di buffer)
Principio del protocollo di comunicazione alla base di MySQL
Linux
Presa TCP/IP
messaggio mysql
Autenticazione tramite handshake a tre vie
Presa Unix
finestre
pipa denominata
condivisione della memoria
Divisione dei moduli sottostanti MySQL
Modulo di inizializzazione
API principale
Modulo di interazione di rete
Modulo di protocollo di interazione client e server
modulo utente
modulo di controllo accessi
Gestione delle connessioni, thread di connessione e gestione dei thread
Modulo di analisi e inoltro delle query
Modulo di ottimizzazione delle query
Modulo di registrazione
Modulo di interfaccia del motore di archiviazione
Il principio di implementazione alla base dell'indice MySQL
Modello di struttura dei dati dell'indice
tabella hash
albero di ricerca binario
albero rosso nero
Albero di ricerca multi-fork bilanciato
B Alberi
Quali categorie ha l'indice?
Indice del testo completo
indice della chiave primaria
indice combinato
indice univoco
La differenza tra innodb e myisam La differenza nell'indice<br>
Principi di base per stabilire e utilizzare gli indici MySQL
I principi alla base delle transazioni MySQL
La differenza tra la dichiarazione di Spring e la transazione di programmazione
Quali problemi si verificheranno se la transazione inizia solo e non viene eseguito il commit/il rollback?
Principio MVCC di controllo multiversione mysql
Livello di isolamento delle transazioni MySQL
lettura ripetibile
leggi commit
Leggi senza impegno
serializzazione
Principi di blocco e rilascio dei blocchi MySQL
Blocco riga, blocco tabella, blocco pagina
Blocco pessimistico/blocco ottimistico
Blocco dello spazio
Cos'è il Gap Lock?
Perché il gap lock è il motivo principale per prevenire le letture fantasma al livello di isolamento RR?
Indice della chiave primaria/indice univoco Verrà aggiunto un gap lock alla lettura corrente?
Se il blocco del gap verrà aggiunto tramite la query dell'intervallo
Gap verrà aggiunto alla lettura corrente se le condizioni di ricerca non esistono?
Principio dell'analisi dello stallo
Blocco a due fasi
Perché si verifica un deadlock?
Il principio alla base di MySQLUndo log
La differenza tra Annulla-log e Ripeti-log
UndoLog implementa il principio dell'atomicità delle transazioni
RedoLog implementa il principio di persistenza delle transazioni
Ottimizzazione pratica delle prestazioni di MySQL
Analisi e soluzioni di query lente SQL
Come abilitare la query lenta di MySQL
Spiegare l'interpretazione del principio del piano di esecuzione
id: maggiore è la colonna, maggiore è la priorità di esecuzione. Se l'id è lo stesso, verrà eseguito dall'alto verso il basso. Se l'id è NULL, verrà eseguito per ultimo.
select_type: indica il tipo di query
tabella: spiega a quale tabella si accede tramite una riga.
colonna tipo
sistema
cost
eq_rif
rif
<p class="MsoNormal"><b><span style="font-family: "Times New Roman"; font-size: 10.5pt;">intervallo </span></b></p>
indice
TUTTO
Extra significa informazioni aggiuntive
Principi di SQL e ottimizzazione degli indici
Segui la regola del miglior prefisso sinistro per evitare errori nell'indice
Prova a utilizzare gli indici di copertura per evitare query sulla tabella
L'ordinamento segue il metodo migliore con il prefisso sinistro per evitare l'ordinamento dei file
Il tipo minimo soddisfa il livello di query dell'intervallo di intervallo
Ottimizzazione della paginazione in cui la condizione dell'ID filtra l'offSet o la sottoquery individua l'associazione dell'ID
La query di unione delle tabelle ottimizza le tabelle di piccole dimensioni per gestire dati di tabelle di grandi dimensioni. È vietato utilizzare l'unione per più di tre tabelle.
Come fuzzy segue la migliore regola del prefisso sinistro o utilizza la query fuzzy dell'indice composito
Principi di ottimizzazione della configurazione MySQL
Ottimizzazione del motore di archiviazione e della struttura delle tabelle
Manuale di sviluppo di Alibaba Ottimizzazione di MySQL dal punto di vista
Tabella e database MySQL
Quando la singola tabella raggiungerà la dimensione massima, verrà suddivisa in tabelle e database.
La differenza tra divisioni orizzontali e verticali
Strategia di sottotabella e sottodatabase
Modulo resto/intervallo
Diviso per intervallo
Diviso per data
Suddiviso per mese
Shard per valore di enumerazione
Affettamento dell'intervallo del modulo binario
Sharding coerente dell'hash
Partizione come specificato dal prefisso del campo di destinazione<br>
Segmentare l'intervallo del modulo in base al codice e al valore ASCII del prefisso
Personalizzazione dello sviluppatore
problema comune
Quali sono i vantaggi e gli svantaggi dell'esecuzione di query dopo il partizionamento di tabelle e database?
Come implementare la query di paging dopo aver diviso tabelle e database
Come implementare la query di unione delle tabelle dopo aver diviso tabelle e database
Perché MyCat non è raccomandato
Netty interpretazione approfondita del codice sorgente
Basi concettuali del modello di rete
Modello di architettura TCP/IP a cinque livelli
Livello di applicazione
strato di trasporto
Livello di rete
livello di collegamento dati
strato fisico
Programmazione di reti socket
Protocollo TCP
Protocollo UDP
Come risolvere il principio dell'indirizzo IP inserendo un indirizzo URL
I principi alla base del protocollo HTTP
Principio di richiesta e risposta del protocollo HTTPS
Principi HTTPS e SSL/TLS
La differenza tra protocollo http e Socket
Principio del modello IO
Modello I/O bloccante
Modello I/O non bloccante
Modello con I/O multiplexati
Modello I/O pilotato da segnali
Modello I/O asincrono
La differenza tra NIO e BIO
Principi base dell'AIO
L'evoluzione da BIO a NIO
Orientato al flusso e orientato al buffer
Bloccante e non bloccante
Principio di implementazione NIO (kernel del sistema operativo)
Concetto principale
buffer del kernel
buffer del processo
kernel di Linux
Selezionare
La complessità temporale è O(n) e esistono alcune restrizioni sul monitoraggio dei descrittori di file.
sondaggio
La complessità temporale è O(n) e non vi è alcun limite all'ascolto dei descrittori di file.
epoll
La complessità temporale è O(1) e non vi è alcun limite all'ascolto dei descrittori di file.
Interpretazione del codice sorgente Netty
Scenari di utilizzo comuni di Netty
struttura RPC
Server Tomcat
Gioco online
Principi dell'architettura NIO
respingente
Selettore
corridoio
Design Netty ad alte prestazioni
Comunicazione asincrona non bloccante
Pool di copia/memoria zero
Scrittura MMAP
Inviare file
Cose a cui pensare:
Come ridurre il numero di copie della CPU
Principio della copia DMA in memoria diretta
Come ridurre il numero di switch del kernel
Modello di filettatura Reactor efficiente
Filo singolo a reattore singolo
Multi-threading a reattore singolo
Modello master-slave del reattore
Concetto di design seriale senza blocchi
Supporto del framework di serializzazione
Interpretazione del codice sorgente Netty
Modello di thread Netty e analisi del codice sorgente
Protobuf del protocollo di serializzazione ad alte prestazioni e analisi del codice sorgente
Fenomeno e soluzione di disimballaggio dei pacchetti appiccicosi, analisi del codice sorgente del codec
Spiegazione dettagliata della memoria diretta e della copia zero di Netty
Pratica del quadro Netty
Basato sul framework RPC scritto a mano di Netty (alta imitazione Dubbo)
Basato sulla versione online multiplayer con scrittura a mano di Netty del gioco del backgammon
Basato sul server web scritto a mano Netty (alta imitazione Tomcat)
Analisi dei principi del kernel del sistema Linux
Lavoro di preparazione del kernel Linux
Una breve analisi dell'architettura del kernel Linux
La differenza tra architettura Linux e struttura del kernel
Meccanismo della piattaforma basata su Linux
Architettura del kernel Linux
Interpretazione del codice sorgente di Spring System Framework
Interpretazione del codice sorgente Spring5
Interpretazione del codice sorgente SpringMVC
Interpretazione del codice sorgente SpringBoot
Nuovo progetto e-commerce retail
Idee di progettazione architettonica
Nuovo concetto di vendita al dettaglio<br>
Progetto di architettura tecnica
SpringBoot
SpringCloudAlibaba
Progettazione intermedia
Centro tecnico
Centro affari
Centro organizzativo
cloud computing
SaaS (Software come servizio)
PaaS (servizio piattaforma)
IaaS (Servizi infrastrutturali)
Integrazione operativa e di sviluppo di Devops e K8S
Apm
Implementare il monitoraggio del servizio
Allarme di monitoraggio
Separazione delle estremità anteriore e posteriore
Front-end ----- Vue è simile alla tecnologia Ajax ed è implementato da ingegneri front-end
Backend ------ Modulo di interfaccia L'ingegnere di backend implementa Java
Costruire servizi infrastrutturali
Distribuire il centro di registrazione/configurazione del servizio Nacos
Costruisci un server privato Maven di livello aziendale
Implementare la chiamata dell'interfaccia RPC nel team dei microservizi
Definire il protocollo di specifica dell'interfaccia API
Costruisci una piattaforma di gestione del code warehouse a livello aziendale
po/do/vo/dto/bo selezionare l'applicazione
Lo scopo è garantire la sicurezza dei dati trasmessi da RPC
Seleziona l'app
DO (oggetto dati): corrisponde alla struttura della tabella del database uno a uno e trasmette gli oggetti dell'origine dati verso l'alto attraverso il livello DAO.
DTO (Data Transfer Object): oggetto di trasferimento dati, un oggetto trasferito esternamente dal servizio o dal gestore
BO (oggetto aziendale): oggetto aziendale. Oggetto che incapsula l'output della logica aziendale dal livello di servizio
AO (oggetto applicazione): oggetto applicazione. Modello di oggetti di riutilizzo astratto tra il livello web e il livello di servizio
VO (View Object): oggetto del livello di visualizzazione, solitamente un oggetto trasmesso dal Web al livello del motore di rendering del modello
Progettazione del centro membri
Implementazione dell'interfaccia di accesso
Perché non utilizzare session
Quando la sessione viene salvata sul server jvm, è necessario considerare il problema della sincronizzazione del cluster di nodi.
Metodo di implementazione del token
Principio di attuazione
Genera casualmente un token (UUID) come valore chiave di Redis come ID utente
Restituisci il token al client e il client chiama l'interfaccia ogni volta che passa il token.
Vantaggi e svantaggi
vantaggio
Nascondi l'autenticità dei parametri
discordanza
È necessario eseguire la query Redis
Implementazione JWT
componenti
intestazione(intestazione)
Carico utile(carico utile)
Firma
Vantaggi e svantaggi
vantaggio
Non è necessario archiviare i dati dell'utente sul server, riducendo la pressione sul lato server
Leggero, lo stile JSON è relativamente semplice
lingua incrociata
discordanza
Impossibile aggiornare il periodo di validità
Impossibile distruggere un jwt
Come implementare il logout in Jwt
Cancella i cookie del browser (ma il server esiste ancora)
Si consiglia di impostare un tempo leggermente più breve
Integra multithreading e pooling di thread
Utilizza il multi-threading per elaborare e-mail, messaggi di testo e coupon inviati dopo l'accesso, migliorando così l'efficienza della risposta dell'interfaccia.
I progetti di grandi dimensioni utilizzano un'elaborazione asincrona mq che richiede molto tempo per ridurre le risorse della CPU del server.
Accesso singolo SSO
modulo web
Implementato in base ai cookie
Separazione delle estremità anteriore e posteriore
Implementato in base a token o jwt
problema comune
Come ottenere le informazioni sull'IP del cliente reale
Impostando l'IP reale dell'utente in nginx
Come risolvere il problema tra domini della separazione front-end e back-end
Utilizza jsonp ma non supporta le richieste di post (non consigliato)
Utilizza l'annotazione SpringMVC @CrossOrigin (consigliato)
Risolvere problemi interdominio in base al gateway (consigliato)
Accesso basato su diversi progetti basati su Nginx (consigliato)
Implementazione del login congiunto
protocollo aperto oauth2
1. Genera l'indirizzo del collegamento di autorizzazione in base all'appid
2. Ottieni il codice di autorizzazione
3. Ottieni l'accessToken in base al codice di autorizzazione
4. Ottenere informazioni sull'utente in base al codice di autorizzazione
Soluzioni distribuite
Svantaggi dei registri di raccolta tradizionali
Utilizza tail per cercare i log su ogni server
soluzione
aop elk kafka implementa la raccolta di log distribuita
Perché Elk deve aggiungere Kafka
Riduci i costi di funzionamento e manutenzione su ciascuna installazione Logstash
Precauzioni
AOP memorizza nella cache i log raccolti in una coda simultanea e li consegna a Kafka in un thread asincrono separato.
Progettazione di pagamenti aggregati
Processo di architettura dei pagamenti
Verificare il metodo di firma
Crittografia asimmetrica RSA
MD5
metodo di richiamata
Richiamata sincrona
Una volta che il pagamento di terze parti è andato a buon fine, passerà al commerciante sotto forma di reindirizzamento del browser di pagamento.
Richiamata asincrona
Il pagamento di terze parti invia notifiche ai commercianti utilizzando una tecnologia simile a HttpClient
Modelli di progettazione
modello di strategia
modello del metodo modello
problema comune
In che modo i callback sincroni e asincroni garantiscono la sicurezza dell'interfaccia
La richiamata sincrona salta sotto forma di browser e non modifica lo stato dell'ordine.
Dopo che la richiamata asincrona ha verificato correttamente la firma, prestare attenzione al problema idempotente per modificare lo stato dell'ordine.
Come impedire agli utenti di pagare ripetutamente
Lo stesso numero d'ordine viene inviato dal modulo al pagamento da parte di terzi e il pagamento da parte di terzi garantirà l'unicità globale in base al numero d'ordine.
Cosa devo fare se il pagamento dell'utente va a buon fine ma lo stato dell'ordine è ancora non pagato?
Questo fenomeno è normale. Per motivi di coerenza finale, puoi chiamare attivamente l'interfaccia Alipay per verificare se l'ordine è stato<br>pagato.
Come gestire l'incoerenza tra l'importo del pagamento dell'utente e l'importo dell'ordine
Nella richiamata asincrona, verrà richiesto in base all'ordine se il numero dell'ordine reale dell'utente è coerente con l'importo del pagamento dell'utente<br>Se non sono coerenti, si tratta di un ordine anomalo.
Quali tipi di campi relativi agli importi della tabella dei pagamenti sono adatti?
La memorizzazione diretta di tipi interi può successivamente essere convertita in elementi
tipo decimale
Come gestire un ordine che non è stato pagato per 30 minuti di straordinario
Implementato in base alla coda di ritardo MQ (consigliato)
1. Dopo che l'ordine è stato effettuato con successo, consegnare un messaggio in coda ritardata a MQ
2. Quando il messaggio scade, verrà trasferito nella coda dei messaggi non recapitati.
3. Il consumatore della coda dei messaggi non recapitati ascolta il messaggio e controlla se lo stato dell'ordine è stato pagato.
Implementato in base alla chiave scaduta Redis (non consigliata)
1. Dopo aver effettuato l'ordine con successo, imposta una chiave di scadenza di 30 minuti su Redis.
2. Quando il cliente monitora la scadenza della chiave, controlla se lo stato dell'ordine è stato pagato.
3. Per abilitare il monitoraggio delle chiavi scadute, è necessario prestare attenzione al prefisso e iscriversi a una libreria Redis separata.
problema comune
La carta dell'utente paga entro 30 minuti. Come garantire la coerenza dello stato dell'ordine?
1. Imposta il timeout per il reindirizzamento degli ordini Alipay su 30 minuti
2. La coda di ritardo chiama attivamente l'interfaccia Alipay per verificare lo stato del pagamento in base al numero dell'ordine per circa 31-35 minuti.
3. Se il pagamento non viene ancora effettuato dopo aver chiamato l'interfaccia Alipay, l'ordine verrà considerato dispendioso in termini di tempo.
Progettazione dell'architettura del sistema di servizio del prodotto
Come ottenere resistenza alla concorrenza elevata
Strato front-end
Ottimizzazione
Architettura di separazione dinamica e statica
Server di risorse statico
server di risorse dinamiche
Compressione statica delle risorse
Genera file .min
cache della CDN
Visita secondo il principio di prossimità
effetto finale
Ridurre la trasmissione della larghezza di banda
strato di interfaccia
Ottimizzazione
Ottimizzazione dei parametri JVM per ridurre il numero di problemi di riciclo GC
Gestisci operazioni dispendiose in termini di tempo sotto forma di disaccoppiamento asincrono multi-threading/MQ
Utilizza la cache Redis per ridurre la pressione dell'accesso al database
Prendi in considerazione la suddivisione di tabelle e database/l'ottimizzazione degli indici per i dati di grandi dimensioni MySQL
effetto finale
Livello di funzionamento e manutenzione
Utilizza la finestra mobile o K8S per espandere/ridurre in modo elastico la distribuzione
JavaSE
grammatica di base
tipo di dati
Tipi di dati di base
Tipo numerico
Intero (byte, short, int, long)
Numero in virgola mobile (float,double)
carattere(carattere)
tipo non numerico
booleano
Tipo di dati di riferimento
classe
interfaccia
vettore[]
orientato agli oggetti
quadro di raccolta
flusso IO
meccanismo di riflessione
Multithreading
JDBC
JavaWeb
Base
Servlet
JSP
telaio
Primavera5
Relazione Spring5 e SpringBoot
Metodo di iniezione SpringBean
Metodo di iniezione SpringBean
Proprietà inserite nel costruttore parametrico
p iniezione dello spazio dei nomi
Iniettare valori nulli e simboli speciali
Iniettare i fagioli interni
Iniettare bean esterni
Iniettare l'assegnazione a cascata
Inserisci le proprietà del tipo di raccolta
Fagioli primaverili
Ciclo di vita di SpringBean
Passaggio 1: utilizzare la tecnologia di riflessione per inizializzare l'oggetto e chiamare il costruttore senza argomenti
Passaggio 2: utilizzare la riflessione per chiamare il metodo set per assegnare valori alle proprietà.
Il terzo passo dell’esecuzione: il pre-metodo post-processore del bean
Passaggio 4: chiama il metodo init nell'oggetto
Passaggio 5: metodo post-processore di Bean
Passaggio 6: distruggi l'oggetto e chiama il metodo di distruzione
Ambito SpringBean
Oggetto singleton
Oggetti a istanza multipla
Cablaggio automatico SpringBean
File delle proprietà esterne SpringBean
Modulo di annotazione SpringBean
Metodo di avvio dell'annotazione SpringBean
Funzione di avvio dell'annotazione di SpringBean
Configurazione della scansione delle annotazioni SpringBean
Annotazioni Autowired e Qualifier
@Utilizzo delle risorse
SpringBean AOP
Concetti base dell'AOP
Il ruolo fondamentale dell'AOP
Proxy statico e proxy dinamico
Utilizzo dell'annotazione @AspectJ
Utilizzare aop per stampare i registri in modo uniforme
Operazioni di transazione SpringBean
Classificazione delle transazioni
Transazioni manuali
la programmazione conta
Sette comportamenti comunicativi degli affari
PROPAGATION_REQUIRED (comportamento di propagazione predefinito)
Se esiste una transazione nel thread corrente, unisciti alla transazione corrente
Se non esiste una transazione per il thread corrente, crea una nuova transazione
PROPAGAZIONE_SUPPORTS
Se esiste una transazione nel thread corrente, unisciti alla transazione corrente
Se non è presente alcuna transazione nel thread corrente, verrà eseguita in modalità non-transazione<br>.
PROPAGAZIONE_MANDATORIA
Se esiste una transazione nel thread corrente, unisciti alla transazione corrente
Genera un'eccezione se è presente una transazione nel thread corrente
PROPAGATION_REQUIRES_NEW
Se esiste una transazione nel thread corrente, la transazione corrente verrà sospesa e verrà creata una nuova transazione.
PROPAGATION_NOT_SUPPORTED
Eseguito sempre in modo non transazionale
PROPAGAZIONE_MAI
Eseguito sempre in modo non transazionale, verrà generata un'eccezione se esiste una transazione nel thread corrente
PROPAGAZIONE_ANNIDATO
Se è presente una transazione nel thread corrente, la transazione verrà nidificata
PrimaveraMVC
Mybatis
Ibernazione
microservizi
SpringBoot2.0
Perché è necessario utilizzare il framework SpringBoot
Può aiutare gli sviluppatori a integrare rapidamente framework di terze parti (principio: incapsulamento delle dipendenze Maven)
Rimuovi la configurazione XML e utilizza completamente l'annotazione (principio: metodo di annotazione integrato nel sistema Spring)
Non è necessario un server Tomcat esterno e un server di implementazione interno (principio: il linguaggio Java supporta il server Tomcat incorporato)
La differenza tra SpringBoot e SpringCloud
Dipendenze SpringCloud e componenti SpringBoot
Utilizzare SpringMVC per scrivere l'interfaccia del protocollo HTTP
Spring Cloud è un framework completo per soluzioni di microservizi
Introduzione all'introduzione delle dipendenze SpringBoot
genitore-avvio-avvio-primaverile,
spring-boot-starter-web
Ruolo @RestController
Tutti i metodi del Controller restituiscono il formato JSON
Metodo di avvio SpringBoot
@EnableAutoConfiguration
@ComponentScan
@SpringBootApplication
È possibile scansionare tutte le classi del pacchetto corrente o dei sottopacchetti
SpringBoot integra l'accesso alle risorse statiche
Quale framework del motore di modelli
Renderizza il Web, il che è vantaggioso per la ricerca SEO
Integra il motore del modello ftl
Integra il motore del modello Thymeleaf
SpringBoot integra origini dati
Modello Jdbc
mybatis
ibernare
Distribuzione a caldo integrata SpringBoot
Integra gli strumenti devtools
Implementazione del caricatore di classi
Integrare Lombok
File di configurazione dell'integrazione SpringBoot
Utilizza l'annotazione @value per leggere i file di configurazione
Le proprietà convertono il formato yml
@ConfigurationProperties
Utilizzo del segnaposto del file di configurazione
Integra diversi file di configurazione in più ambienti
Modifica la porta e il percorso del contesto
Framework di registro integrato SpringBoot
logback
log4j
Utilizzare aop per stampare le informazioni del registro in modo uniforme
Attività pianificate di SpringBoot
Integra le attività pianificate con l'annotazione @Scheduled
Attività di integrazione temporizzata combinate con espressioni Quartz
SpringBoot integra il multi-threading asincrono
Presta attenzione al problema di invalidazione @Async
@Async integra il pool di thread
Integrare le eccezioni globali alle catture
Pacchetto ed esecuzione del rilascio
Strumenti del progetto
finestra mobile
concetto di base
Perché è necessario utilizzare docker
Vantaggi dell'utilizzo della finestra mobile
La differenza tra contenitori e macchine virtuali
Installazione dell'ambiente
Installa la finestra mobile in ambiente Linux
Installa la finestra mobile nell'ambiente Win
Tre elementi principali
File immagine
contenitore
magazzino
Principio dello specchio
Principio di download delle immagini Docker
Principio di caricamento delle immagini Docker
bootfs
rootfs
Unione fs
Configurazione dell'immagine accelerata dal cloud
Immagine accelerata di Alibaba Cloud
Immagine accelerata nel cloud Huawei
Specchio accelerato HKUST
Comandi comuni di Docker
docker --help (comando di aiuto)
docker --version (visualizza versione)
immagini della finestra mobile (visualizza immagini)
ricerca finestra mobile (immagine di ricerca)
pull della finestra mobile (scarica immagine)
latest -----tag dell'ultima versione del file immagine
contenitore docker
esecuzione della finestra mobile (avvio del contenitore)
docker start avvia l'ID del contenitore
ID del contenitore di arresto della finestra mobile
ID contenitore docker rm
docker exec -it [ID CONTAINER] bash (inserisci contenitore)
log docker --da 30 mesi CONTAINER_ID (visualizza i log del contenitore)
Docker Commit (trasformato in un file immagine basato sul contenitore corrente)
Volume dati Docker -v
Installa il software di uso comune
Tomcat
docker run -p 8081:8080 -d tomcat:8
Nginx
docker esegui --name nginx81 -d -p 81:80
MySQL
docker create --name mysql3308 -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 mysql:5.7
Analisi di DockerFile
Specifiche di scrittura di DockerFile
Direttiva DockerFile
Crea un progetto Springboot basato su Dockerfile
Docker Componi
Componi comandi comuni
docker-compose -h
docker-componi
docker-componi giù
log di composizione docker
pull della finestra mobile-composizione
configurazione dokcer-compose
riavvio docker-compose
avvio della composizione docker
Componi il file modello
Distribuire il progetto di microservizi SpringBoot MySQL Nginx
Utilizzo dello strumento di visualizzazione Docker
Portainer
DockerUI
k8s
concetto meta-nativo
microservizi
Comunicazione riposante tra le applicazioni
Può essere dispiegato/espanso e ridotto elasticamente in modo indipendente
devops
Pipeline di rilascio automatizzata, strumenti Ci/CD
Distribuisci rapidamente l'ambiente di produzione
Integrazione di sviluppo, funzionamento e manutenzione
consegna continua
Rilasci frequenti, consegna rapida, feedback rapido e rischi di rilascio ridotti
Containerizzazione
Il miglior operatore per i microservizi
Modelli di progettazione
modalità proxy