Галерея диаграмм связей Уровень развития Java-архитектора p5-p7 с годовой зарплатой 500 000-700 000.
Путь развития Java-архитектора p5-p7 с годовой зарплатой 500 000-700 000, практическая структура данных и алгоритм, модель структуры данных микросервисного решения, практическая настройка производительности виртуальной машины JVM. Практика параллельного программирования, интерпретация исходного кода платформы микросервисов, интерпретация исходного кода платформы сбора данных, решения для распределенной архитектуры. Проектирование и фактическая реализация архитектуры распределенных транзакций в Интернете, принципы промежуточного программного обеспечения распределенных сообщений, фактическая оптимизация производительности MySQL и глубокая интерпретация исходного кода Netty.
Отредактировано в 2023-11-21 16:53:38Путь к карьерному росту в качестве JAVA-архитектора
Структура данных и практика алгоритмов
Проверка знаний по математике
индекс
логарифм
ряд
Арифметика по модулю
сложность
временная сложность
космическая сложность
структура данных
модель стека
Принцип «первым пришел — последним вышел»
Поп/Пуш
стековое приложение
модель очереди
принцип «первым пришел — первым вышел»
последовательная очередь
цепная очередь
дек
приоритетная очередь
модель дерева
Бинарное дерево
АВЛ-дерево
двоичное дерево подсказки
красное черное дерево
раскидистое дерево
Хэш-модель
хэш-функция
Линейный метод обнаружения
метод обнаружения квадратов
двойной хэш
Метод хэш-функции
метод прямой адресации
цифровая аналитика
Метод квадратного среднего
метод складывания
метод деления с оставлением остатка
метод случайных чисел
Как справляться с конфликтами
Линейное зондирование и последующее хеширование
квадратичное зондирование и хеширование
модель кучи
Левая свая
косая куча
Практика алгоритма
Алгоритм сортировки
сортировка вставкой
Сортировка холмов
Сортировка кучей
Сортировка слиянием
Быстрая сортировка
Пузырьковая сортировка
Практический алгоритм
жадный алгоритм
Кодирование Хаффмана
Приблизительная задача по упаковке контейнера
алгоритм разделяй и властвуй
Время работы алгоритма «разделяй и властвуй»
Недавние проблемы
Выберите вопрос
динамическое программирование
Используйте таблицу вместо рекурсии
Порядок умножения матрицы
оптимальное двоичное дерево поиска
Кратчайший путь для всех пар точек
алгоритм рандомизации
генератор случайных чисел
стол для прыжков
тест на выявление способностей
Модель структуры данных микросервисного решения
Алгоритм кластеризации регистрационного центра
Алгоритм Raft для выборов в кластер Nacos
Алгоритм распространения эпидемии Протокол P2P-Gossip
Протокол согласованности широковещательной рассылки сообщений Eureka
Протокол согласованности распределенных транзакций
Строгий протокол согласованности
Слабый протокол согласованности
протокол окончательной согласованности
Алгоритм протокола консенсуса Zookeeper
ZAB Протокол атомного вещания
Протокол консенсуса Паксиса
Алгоритм устранения распределенного кэша
Алгоритм вытеснения кэша LRU (реже используемый в последнее время)
LFU (наименее часто используемый алгоритм) алгоритм вытеснения кэша
Алгоритм устранения кэша ARC (Адаптивный алгоритм замены кэша)
Алгоритм вытеснения кэша FIFO (первым вошел — первым вышел)
Алгоритм вытеснения кэша MRU (последний использованный)
Протокол разбивки распределенного кэша
фильтр Блума
фильтр с кукушкой
Алгоритм балансировки нагрузки
Алгоритм механизма опроса
случайный алгоритм
алгоритм фиксированного IP
алгоритм веса
Алгоритм ограничения тока микросервиса
Алгоритм счетчика (фиксированного окна)
алгоритм скользящего окна
алгоритм дырявого ведра
Алгоритм сегмента токенов
Алгоритм планирования задач распределенных вычислений (xxl-job)
метод вращения
Метод взвешивания
Хеширование
метод наименьшего соединения
метод минимального пропуска
самый быстрый метод ответа
генетический алгоритм
Решение алгоритма муравьиной колонии
Протокол синхронизации и согласованности распределенных данных
MySQL
полусинхронная репликация
Асинхронная репликация
Глобальная синхронизация
кэш
канал
выдра
(openresty/tengine) Фактическая высокая степень параллелизма
Собственный основной модуль Nginx
Типы модулей Nginx
Стандартный HTTP-модуль
Дополнительный HTTP-модуль
Сторонний модуль (lua)
Модель и возможности Nginx, управляемые событиями
Конфигурация ядра Nginx
Конфигурация виртуального хоста
вверх по течению
расположение
Статическая конфигурация каталога
конфигурация протокола https
Конфигурация алгоритма балансировки нагрузки Nginx
Алгоритм механизма опроса
случайный алгоритм
алгоритм фиксированного IP
алгоритм веса
OpenResty/Tengine
openresty в сочетании с lua создает страницу с подробной информацией о продукте на миллиардном уровне.
Tengine — проект веб-сервера, разработанный Alibaba.
Практическая настройка производительности виртуальной машины JVM
История развития языка программирования
Язык ассемблера/машинный язык
язык Си/Си
Java/php/простой язык/ython
Загрузчик классов JVMClassLoader
Анализ принципа реализации загрузчика классов из исходного кода виртуальной машины HotSpot (C)
Что такое загрузчик классов
Считайте наш файл класса в память
Классификация загрузчиков классов
Загрузчик классов Bootstrap (написан на C)
$JAVA_HOME/jre/lib
Загрузчик классов расширений (написан на Java)
JAVA_HOME/jre/lib/ext
(Приложение) Загрузчик классов AppClassLoader (написан на Java)
Пакеты классов и jar в пути к классам
Пользовательский загрузчик классов (написан на Java)
Каталог файлов пользовательского класса
Преимущества механизма родительского делегирования
Цель — предотвратить конфликты между классами, определенными разработчиками, и классами исходного кода, определенными jdk, а также обеспечить уникальность класса в памяти.
Принцип родительского делегирования загрузчика классов и как его нарушить
спи-механизм
Углубленный анализ исходного кода загрузчика классов запуска/расширения/приложения.
Принцип интерфейса поставщика Java SPIService
Принцип реализации загрузчика классов Tomcat/Jetty
Как настроить загрузчик классов для загрузки байт-кода и написанного вручную подключаемого модуля горячего развертывания
Локальный диск
Приобретение сети
база данных
Динамическое создание прокси
война/банка
Анализ принципа структуры памяти JVM
Зона выполнения JVM
счетчик команд
Запишите номер строки кода, выполняющего текущий поток, чтобы облегчить следующее переключение контекста ЦП для возобновления выполнения.
куча
новые объекты хранятся в куче (разделяются потоками)
Устранение проблем с утечками кучи памяти в производственной среде
утечка памяти
Что такое утечка кучи памяти
Область приложения кучи памяти, GC не может освободить память
Сценарии возникновения утечек памяти
утечка локальной памяти потока
Утечка памяти объекта пользовательского ключа hashMap
Устранение проблем с утечками кучи памяти в производственной среде
Jps/Jmap
Jvisualvm/jconsole
переполнение памяти
Что такое переполнение кучи памяти
При подаче заявки на место в куче памяти недостаточно места.
Переполнение кучи памяти
Объем данных, загруженных в память, слишком велик, например, из базы данных извлекается слишком много данных за один раз.
В классе коллекции есть ссылка на объект, которая не очищается после использования, поэтому JVM не может ее переработать.
В коде имеется бесконечный цикл или цикл генерирует слишком много повторяющихся объектов объекта.
Значение параметра памяти параметра запуска устанавливает слишком маленький размер кучи.
Решение проблемы переполнения памяти
Увеличение кучи памяти
Подробности структуры памяти кучи
Разделение структуры кучи
Новое поколение/Старое поколение
новое поколение
Вновь созданный объект сохраняется в новом поколении.
старость
Часто используемые объекты сохраняются в старом поколении
JDK-версия
jdk1.7
eden (Райский сад) от (s0) до (s1) постоянное поколение (область метода)
jdk1.8
Эдем (Райский Сад) от (s0) до (s1) постоянное поколение (метапространство)
характеристика:
Соотношение по умолчанию между новым поколением и старым поколением составляет 1:2.
-XX:Новое соотношение
Эдем по умолчанию с s0/s1 8:1:1
-XX:Соотношение выживших
распространенные слова
ЯнгГен (новое поколение)
oldGen (старое поколение)
s0(от)
s1(к)
PermGen (постоянная генерация)
Метапространство
Классификация ГК
частичная коллекция
Коллекция нового поколения (Minor GC/Young GC)
Коллекция старого поколения (Major GC/Old GC)
CMS GC старого поколения будет собирать отдельно.
Сбор областей кучи и метода
(Полный сборщик мусора): собрать сборку мусора всей кучи Java и области методов (метапространство).
Общие вопросы на собеседовании
Разница между полным GC и второстепенным GC/молодым GC
Полный сборщик мусора вызовет сбор нового поколения и старого поколения.
Незначительный GC запускает сборщик мусора нового поколения
Незначительные коллекции GC встречаются очень часто.
полный сборщик мусора запускает перезапуск, когда в области старого поколения или метода (метапространстве) недостаточно памяти.
Эффективность восстановления полного GC очень низкая.
Старайтесь не запускать полную переработку GC.
Где хранятся крупные предметы?
Если райскую область невозможно сохранить, она будет сохранена непосредственно в старом поколении.
Анализ журналов GC
побег из памяти
Гарантия пространства
Анализ внутренней структуры стека потоков и кадра стека
таблица локальных переменных
стек операндов
динамическое соединение
экспорт метода
Технология стека локальных методов (JNI, вызывающая код C)
Пул строковых констант
Классификация постоянных пулов
статический постоянный пул
Запустить постоянный пул
Пул строковых констант
Постоянный пул для разных областей хранения версий JDK
Пул строковых констант в JDK1.6 и более ранних версиях хранится в области метода (постоянная генерация).
Пул строковых констант в JDK1.7 начинает храниться в куче.
Пул строковых констант в JDK1.8 хранится в куче.
Распространенные вопросы на собеседовании по String
Почему JDK1.7 начал хранить пул строковых констант в куче?
В JDK7 пул строковых констант размещается в куче. Поскольку эффективность переработки постоянного поколения очень низка, сбор мусора постоянного поколения будет выполняться только во время полного GC, а полный GC будет запущен, когда в старом поколении недостаточно места и недостаточно постоянного поколения. .
Это приводит к низкой эффективности повторного использования пула строковых констант. В нашей разработке будет создано большое количество строк, а эффективность повторного использования будет низкой, что приведет к недостаточности постоянной памяти генерации. Помещение его в кучу позволяет вовремя освободить память.
Строка s1 = "майикт";
String s1 = "mayikt"; s1 указывает на пул строковых констант.
новая строка («майикт»);
Создайте адрес места в куче и верните его в s2. s2 получает адрес кучи памяти, а mayikt вводит пул строковых констант в классе String.
Структура объектной памяти JVM
макет объекта
Заголовок объекта
Данные экземпляра
Выровнять отступы
Сколько байт занимает новый объект?
Место доступа к объекту
режим обработки
Часть памяти может быть разделена на кучу Java как пул дескрипторов. То, что хранится в ссылке в локальной переменной, является адресом дескриптора объекта.
метод прямого указателя
То, что хранится в ссылке, является непосредственно адресом объекта.
Как создаются объекты
1.новый объект
2. Создавайте объекты, используя отражение
3. Используйте clone(), чтобы клонировать объект.
4. Используйте десериализованные объекты
5. Сторонняя библиотека Objenesls создает объекты.
Создание деталей объекта
1. Проверьте, загружен ли, проанализирован и инициализирован класс объекта.
1. Когда виртуальная машина Java встречает новую инструкцию в байт-коде, она сначала проверяет, могут ли параметры этой инструкции найти символическую ссылку класса в пуле констант (в метапространстве), и проверяет класс, представленный этой символической ссылкой. Был ли он загружен, проанализирован и инициализирован (чтобы определить, был ли класс загружен метапространством)
Если нет, то сначала должен быть выполнен соответствующий процесс загрузки класса (затем используйте механизм родительского делегирования, чтобы найти класс (полный путь к классу), если он не найден, будет сообщено об ошибке: ClassNotFoundException).
2. После прохождения проверки загрузки классов виртуальная машина выделит память для нового объекта.
Используйте, если память кучи является регулярной
столкновение указателей
Используйте, если память кучи нерегулярна.
бесплатный список
3. Создание объекта — очень частое явление на виртуальной машине. Даже если вы изменяете только местоположение, указанное указателем, это не является потокобезопасным при параллельных обстоятельствах.
1. Используйте повторную попытку сбоя CAS, чтобы обеспечить атомарность обновлений;
2. Выделите для каждого потока часть пространства TLAB, уникальную для текущего потока в Eden (Eden Campus).
4. Установите значение атрибута по умолчанию. После завершения выделения памяти виртуальная машина должна инициализировать выделенное пространство памяти (но не включая заголовок объекта) равным нулю. Если используется TLAB, эту работу также можно выделить заранее. в ТЛАБ, кстати. Этот шаг гарантирует, что поля экземпляра объекта можно будет использовать непосредственно в Java-коде без присвоения начальных значений, чтобы программа могла получить доступ к нулевым значениям, соответствующим типам данных этих полей.
5. Установите информацию заголовка объекта. Виртуальной машине Java также необходимо выполнить необходимые настройки для объекта, например, экземпляром какого класса является объект, как найти информацию о метаданных класса и хэш-код объекта. (на самом деле хэш-код объекта будет отложен до фактического вызова метода Object::hashCode()), возраст генерации GC объекта и другая информация. Эта информация хранится в заголовке объекта (Object Header) объекта. В зависимости от текущего рабочего состояния виртуальной машины, например, включена ли блокировка смещения и т. д., заголовок объекта будет установлен по-разному.
6. Выполните метод init для инициализации.
Алгоритм сборки мусора JVM
Алгоритм сбора мусора
Алгоритм маркировки и развертки
Преимущества: высокая эффективность/нет перемещения адресов памяти.
Недостатки: склонен к фрагментации.
алгоритм сортировки тегов
Преимущества: позволяет избежать проблем фрагментации.
Недостатки: перемещение адреса памяти, низкая эффективность.
Алгоритм маркированного копирования
Преимущества: позволяет избежать проблем фрагментации.
Недостатки: перемещение адреса памяти, высокая эффективность.
Принцип алгоритма генерации
новое поколение
старость
Сборщик JDK1.0-14
Комбинация сборщика мусора
(Параллель в новом поколении) ParNew (последовательный в старом поколении) Серийный старый
(Серий нового поколения) Серийный, (Старое поколение) Серийный старый
(Серийный сервер нового поколения) Последовательный порт/CMS (параллелизм старого поколения)
(JDK9 устарел)
(Параллелизм в новом поколении) ParNew/CMS (Параллелизм в старом поколении)
(Не рекомендуется для JDK9)
(параллельный порт нового поколения) Parallel/SerialOld (последовательный порт старого поколения)
Не рекомендуется
(Параллельно в новом поколении) Параллельная очистка/Параллельно Старое (параллельно в старом поколении)
JDK8 по умолчанию
G1 (по умолчанию JDK9) вся коллекция кучи
JDK8 по умолчанию
Последовательный (переработка одного потока GC)
Подробное объяснение последовательного сборщика мусора
комбинация
Алгоритм репликации нового поколения (последовательный)
Алгоритм последовательного сжатия старых марок
Сценарии применения
Используйте одноядерный процессор и небольшой объем памяти.
Параллельный (перезапуск нескольких потоков GC)
Подробное объяснение сборщика мусора ParNew
Сценарии применения
новое поколение
Подходит для многоядерных процессоров.
комбинация
(Старое поколение) Серийный старый (алгоритм сжатия меток)
(Старое поколение) CMS (алгоритм маркировки и очистки)
Подробное объяснение параллельного сборщика мусора
Сценарии применения
Несколько коллекций GC нового/старого поколения одновременно
комбинация
Параллельно
Параллельный старыйGC
Параллелизм (GC и пользовательские потоки выполняются одновременно)
Принцип сборщика мусора CMS (ключевые моменты)
Принцип реализации
начальная отметка
одновременная маркировка
переименовывать
Параллельная очистка
Каковы недостатки сборщика CMS?
Алгоритм маркировки и очистки вызывает проблему фрагментации
Альтернативный SerialOld неэффективен
Решите проблему отсутствия меток на основе метода инкрементного обновления.
Принцип коллектора G1 (ключевые моменты)
Принцип реализации
n несколько разных регионов
Набор памяти региона (Remember Set)
Подробное объяснение Cardtable
Решить задачу разметки зданий на основе исходного снимка (SATB)
Подробное объяснение сборщика мусора ZGC
Подробное объяснение сборщиков мусора Epsilon и Shenandoah.
алгоритм копирования мусора
Принцип алгоритма трехцветной маркировки механизма сбора мусора
Множественные проблемы с маркировкой/отсутствием маркировки, вызванные алгоритмом трехцветной маркировки
плавающий мусор
Проблема с отсутствующей ставкой
Решение проблемы отсутствия метки объекта
На основе метода инкрементного обновления (CMS).
На основе оригинального метода моментальных снимков satb(G1)
Подробное объяснение набора памяти региона (Remember Set) и карточной таблицы (Cardtable).
остановить мир
Почему возникает проблема остановки мира?
Как избежать проблемы «Остановим мир»
Подробное объяснение инструментов настройки JVM.
Подробное объяснение собственных команд настройки Jstat, Jinfo, Jmap, Jhat и Jstack в JDK.
Подробное объяснение инструментов настройки Jvisualvm и Jconsole.
Подробное объяснение использования инструмента Alibaba arthas.
Инструмент анализа журналов GC
Как прочитать данные журнала GC
Использование инструмента анализа журналов GCEasy
Использование инструмента анализа журналов GCViewer
Практика настройки параметров JVM
100-миллионный уровень трафика проекта кучи памяти установки и настройки параметров сбора мусора молодого поколения и старого поколения
Онлайн-производственная среда Инструмент мониторинга переполнения памяти OMM и решение для позиционирования
Практики оптимизации, позволяющие снизить риск возникновения серьезных проблем с полным сбором мусора в онлайн-производственных средах, которые приводят к прямым зависаниям системы.
Система высокого параллелизма: как избежать частых операций сборки мусора в онлайн-производственной среде
Система высокого параллелизма, как оптимизировать сборщик G1/CMS
Как установить начальный размер памяти JVM-кучи для среднесуточной службы в миллион PV
Параллельное программирование на практике
Основы операционной системы
Процесс переключения между пользовательским режимом и режимом ядра
Управление моделью процессов Linux
Принцип межпроцессного взаимодействия Linux
Принципы сетевого взаимодействия Linux
Основы многопоточности
Быстрый старт с многопоточностью
Что такое процесс/поток
Процесс — это наименьшая единица распределения ресурсов.
Поток — это наименьшая единица выполнения программы.
Сценарии многопоточных приложений
Разработка клиента (мобильного приложения/)
Отправка SMS/отправка электронной почты асинхронно
Измените код, выполнение которого требует времени, на многопоточное асинхронное выполнение.
Запись журнала асинхронно
Многопоточная загрузка
Разница между многопоточностью и однопоточностью
Многопоточность (параллельное выполнение)
Один поток (синхронное выполнение)
Как понять концепцию многопоточного переключения процессора
Текущий процессор переключается на выполнение другого потока
Правда ли, что чем больше многопоточности включено, тем лучше?
Не обязательно открытие слишком большого количества потоков может легко привести к переключению контекста ЦП.
Разница между пользовательскими потоками и потоками демона
Как изящно остановить поток
Анализ семи состояний многопоточности
начальное состояние
готовое состояние
Рабочее состояние
<font face="宋体"><span style="font-size: 14px;">Состояние смерти</span></font><br>
состояние блокировки
тайм-аут, ожидание
состояние ожидания
Пять способов создания многопоточности
Наследуйте класс Thread для создания потока
Реализация интерфейса Runnable для создания потока
Создавайте потоки, используя Callable и Future
Используйте пул потоков, такой как платформа Executor.
Создайте поток, используя асинхронную аннотацию @Async.
Создайте поток, используя лямбда-выражение
Многопоточная безопасность потоков
Что такое проблема безопасности потоков
Когда несколько потоков одновременно записывают данные в одну и ту же глобальную переменную, им могут мешать другие<br>потоки, что может привести к проблемам с безопасностью потоков.
Разница между блокировкой и синхронизированной блокировкой
lock Ручное получение и снятие блокировок
Синхронизировано автоматически получает и снимает блокировки
SynchronizedJDK6 запускает процесс автоматического обновления блокировки.
Базовая реализация блокировки основана на блокировке aqs и требует обновления блокировки вручную.
Проблема многопоточной взаимоблокировки
Как устранить взаимоблокировку с многопоточностью
jconsole.exe диагностирует взаимоблокировку
Причины многопоточных взаимоблокировок потоков
Вложенная синхронизация внутри синхронизации
Как решить проблемы потокобезопасности (как обеспечить синхронизацию потоков)
Synchronized решает проблемы безопасности потоков
синхронизированный код синхронизации быстрый
синхронизированный модифицированный метод экземпляра
синхронизированный модифицированный статический метод
Блокировка блокировки решает проблему безопасности потоков
Связь между несколькими потоками
подожди и сообщи
wait снимает текущую блокировку и блокирует текущий поток
notify пробуждает заблокированный поток
Принцип метода соединения
Нижний уровень основан на инкапсуляции ожидания.
синхронизированный принцип
Как устроен объект
Заголовок объекта
Марк Ворд
Хэш-код (HashCode), возраст генерации GC, флаг состояния блокировки, блокировка, удерживаемая потоком, смещенный идентификатор потока, смещенная метка времени
Класс Пойнтер<br>
Данные экземпляра
свойства члена
Выровнять отступы
Размер объекта должен быть целым числом, кратным 8 байтам. Если он не является целым числом, кратным 8 байтам, он будет выровнен и дополнен.
Процесс обновления синхронизированной блокировки
блокировка смещения
Блокировка и разблокировка не требуют дополнительных затрат. Они подходят только для одного и того же потока для доступа к синхронизированному блоку кода и не требуют дополнительных затрат. Если несколько потоков конкурируют одновременно, блокировка будет отменена.
Легкий замок
Конкурирующие потоки не будут блокироваться, что повышает скорость ответа программы. Если конкурирующий поток для блокировки никогда не будет получен, спин будет использоваться для потребления ресурсов ЦП. Это подходит для ситуаций, когда синхронизированные блоки кода выполняются очень быстро. ротация после 7)
весовой замок
Конкуренция потоков не использует вращение, не потребляет ресурсы ЦП и подходит для синхронного выполнения кода в течение относительно длительного времени.
Анализ по принципу синхронного процесса расширения замков
Замок смещения(101)
1. Текущий поток определяет, является ли это смещенной блокировкой, по метке в заголовке объекта. Если это смещенная блокировка, определите, является ли id потока === идентификатором текущего потока.
2. Если он равен текущему идентификатору потока, операция CAS не будет выполняться повторно, а напрямую войдет в наш блок кода синхронизации.
3. Если он не равен текущему идентификатору потока, если это ситуация без блокировки и нет других потоков, конкурирующих со мной, напрямую используйте CAS, чтобы изменить статус блокировки в markword на 101, а также сохранить текущий идентификатор потока. в маркворде.
4. Другие потоки начинают конкурировать с потоком блокировки смещения. Если количество отмен блокировки смещения достигает 20, они напрямую перенаправляют блокировку смещения на поток T2 в пакетном режиме (обратите внимание: других потоков, конкурирующих с t2, нет). количество отмен блокировки смещения достигает 20, 40 раз, пакетная отмена начнется позже.
5. Чтобы отменить смещенную блокировку, нам нужно остановить поток смещенной блокировки в глобальной безопасной точке, изменить метку на облегченную блокировку и разбудить поток смещенной блокировки.
6. Примечание. JDK15 по умолчанию отключает оптимизацию смещенной блокировки.
Легкий замок(000)
1. Если несколько потоков одновременно конкурируют за одну и ту же блокировку, обновите облегченную блокировку и используйте CAS (измените статус блокировки метки = 00). В случае успеха замените ее меткой и сохраните значение HashCode непосредственно в нашем стековом фрейме. , Адрес блокировки записи хранится в markword
2. Когда мы используем облегченную блокировку для снятия блокировки, содержимое значения метки восстанавливается.
Тяжеловес (010) (Монитор C)
1. Если наш поток повторил попытку несколько раз и все еще не получил блокировку, текущая блокировка будет повышена до тяжеловесной блокировки.
2.2. Потоки, которые не получили блокировку, будут храниться в коллекции EntryList объекта C Monitor. В то же время текущий поток напрямую блокирует и освобождает права выполнения процессора. Стоимость процесса пробуждения и повторного входа в соревнование. Блокировка в более поздний период очень высока, поскольку необходимо переключение контекста процессора. Переключитесь из пользовательского режима в режим ядра и измените значение метки в заголовке нашего объекта на C Monitor. Java-объект указателя адреса памяти связан с C Monitor.
C Блокировка монитора (тяжелый замок)
Монитор (тяжелый замок объекта)
рекурсии (количество рекурсий/количество повторных входов)
владелец (записывает идентификатор потока, в данный момент удерживающего блокировку)
waitSet (потоки, ожидающие перехода пула в состояние ожидания, будут добавлены в _WaitSet)
enterList (пул блокировок: потоки, ожидающие состояния блокировки блокировки, будут добавлены в список)
Когда поток в пуле ожидания пробуждается, будет ли блокировка получена немедленно?
После того как поток в пуле ожидания пробуждается, пул ожидания переводится в пул блокировок и ставится в очередь, чтобы снова конкурировать за блокировку.
Укрупнение блокировки, устранение и оптимизация производительности
Придание шероховатости замкам
Каждый поток удерживает блокировку как можно более короткое время.
Устранение замков
Устранение блокировок — это метод оптимизации блокировок, который происходит на уровне компилятора.
принцип изменчивых ключевых слов
свойства ключевых слов
Обеспечьте видимость
Отключить изменение порядка
Нет гарантии атомарности
модель памяти Java
Анализ аппаратной архитектуры многоядерного процессора
Характеристики синхронизации jmm восемь
Протокол согласованности энергозависимого кэша
автобусный замок
Протокол МЭСИ
Проблема ложного обмена
Основные понятия о строках кэша
План наполнения банка
Зачем вам нужно добавлять изменчивость к переупорядочению/барьеру памяти/блокировке двойной проверки?
Разница между синхронизированным и нестабильным
Почему Volatile не гарантирует атомарность
Классификация одновременных блокировок
пессимистический замок
оптимистическая блокировка
спин-блокировка
Повторный входной замок
справедливый замок
нечестная блокировка
интерпретация исходного кода aqs
Интерпретация исходного кода LockSupport
Интерпретация исходного кода AbstractQueuedSynchronizer
ReentrantLock/ReentrantReadWriteLock, интерпретация исходного кода ReadWriteLock
Интерпретация исходного кода Semaphore/CountDownLatch/CyclicBarrie
Как реализовать нижний уровень AQS
A.Cas обеспечивает потокобезопасность AQS.
Б. В двусвязном списке хранятся заблокированные темы.
C.LockSupport блокирует и пробуждает потоки
основные атрибуты
Государственная государственная ценность
Статус узла (waitStatus)
-2 Текущий поток одновременно блокирует и снимает блокировку
-1 пробуждает поток последующих узлов<br>
Сценарии применения AQS
Базовая реализация блокировки блокировки
Справедливая блокировка и несправедливая блокировка
По умолчанию используется нечестная блокировка.
Время блокировки конфликтов
Честная блокировка: если при конкуренции за блокировку блокировка уже удерживается другим потоком, она будет сохранена непосредственно в конце двусвязного списка.
Несправедливая блокировка: если при борьбе за блокировку блокировка уже удерживается другим потоком, CAS все равно будет предпринята еще раз.
Основные принципы проектирования
метод блокировки()
Используйте CAS, чтобы изменить значение статуса в классе AQS с 0 на 1.
Если изменение прошло успешно (блокировка получена успешно)
Если изменение не удалось (не удалось получить блокировку)
Хранится в двусвязном списке AQS.
метод разблокировки()
Используйте CAS для изменения статуса в классе AQS с 0 на 1.
Если CAS прошел успешно
Необходимо разбудить поток, кэшированный следующим узлом головного узла в двусвязном списке AQS.
Вопрос: Почему разблокировка снимает блокировку и пробуждает только один поток, а не несколько потоков?
Нижний уровень использует двусторонний связанный список для хранения заблокированных потоков. Стоимость пробуждения всех потоков очень высока.
В замке нет процесса обновления замка, и разработчикам приходится расширять его самостоятельно.
Исходный код ConcurrentHashMap1.7, лежащий в основе блокировки
Состояние
Примечание. Условие и блокировка не используют один и тот же двусвязный список.
Блокировка пула и пул ожидания
Пул блокировок: относится к потокам в блокировке, которые не смогли конкурировать за блокировку и хранятся в двусвязном списке AQS.
Пул ожидания: относится к текущему потоку, вызывающему метод ожидания, активно снимающему блокировку (значение состояния aqs = 0) и сохраняющему его в двусвязном списке пула ожидания.
Как разбудить поток в пуле ожидания?
Вызов этого сигнала() только передает узлы узла (потоки) из пула ожидания в пул блокировок двусвязного списка AQS, чтобы снова конкурировать за ресурсы блокировки.
После вызова этого signal() и метода разблокировки потоки в пуле блокировки пробуждения начинают конкурировать за ресурсы блокировки.
CountDownLatch(счетчик)
Через конструктор new CountDownLatch(1)
Базовая реализация, основанная на AQS, устанавливает значение статуса в классе AQS равным 1.
метод ожидания
Сохраните текущий блок потока в двусвязном списке AQS.
обратный отсчет
Управляйте значением статуса -1 в классе AQS. Если статус AQS изменен на 0, разбудите поток, хранящийся в двусвязном списке в классе AQS.
Семафор(Семафор)
Через конструктор новый Семафор(3)
Базовая реализация, основанная на AQS, устанавливает значение статуса в классе AQS равным 3.
Базовая операция получения заключается в изменении значения статуса -1 в классе AQS. Если значение статуса в классе AQS изменяется на 0, текущий поток необходимо заблокировать и сохранить в двусвязном списке в классе AQS.
Нижний уровень выпуска работает со статусом 1 в классе AQS<br>
Одновременное пробуждение заблокированных потоков в классе AQS (будет только один)
CyclicBarrier (барьер синхронизации)
Через конструктор new CyclicBarrier(2)<br>
Нижний уровень присваивает значение = 2 атрибуту счетчика CyclicBarrier.
Вызов ожидания нижнего уровня
Операция по счетчику CyclicBarrier-1
количество = 0
Продолжить выполнение и разбудить все потоки в пуле ожидания.
считать!=0
Хранится в пуле ожидания
Параллельные атомарные операции
Атомный класс
Принцип CAS (оптимистическая блокировка)
Подробное объяснение класса небезопасной магии.
Blocking QueueПринцип BlockingQueue
Классификация очереди блокировки
Ограниченная очередь массива ArrayBlockingQueue
Ограниченная очередь связанного списка ConcurrentLinkedQueue
PriorityBlockingQueue приоритетная сортировка неограниченной очереди
DelayQueue задерживает неограниченную очередь
Рамочное приложение
Рукописный пул потоков на основе BlockingQueue
Промежуточное программное обеспечение для рукописных сообщений на основе BlockingQueue
Фреймворк рукописного журнала на основе BlockingQueue
Подробное объяснение пула потоков Executor и анализа исходного кода ядра.
Зачем использовать пул потоков
Многоразовое использование
Единое управление
Улучшить ответ
Четыре способа создать пул потоков
newCachedThreadPool(); Кэшируемый пул потоков
newFixedThreadPool(); можно зафиксировать длину и ограничить максимальное количество потоков.
newScheduledThreadPool(); можно запланировать
newSingleThreadExecutor();
Реальный нижний уровень основан на пуле потоков инкапсуляции конструктора ThreadPoolExecutor.
Анализ основных принципов пула потоков
LinkedBlockingQueue
модель производителя и потребителя
Почему Alibaba не рекомендует использовать Исполнителей
Базовое использование неограниченной очереди LinkedBlockingQueue подвержено переполнению памяти.
Что делать, если очередь пула потоков заполнена
Запретить политику
AbortPolicy отбрасывает задачи и генерирует исключения времени выполнения.
Задача выполнения CallerRunsPolicy
DiscardPolicy Игнорировать, ничего не произойдет.
DiscardOldestPolicy выбрасывается из очереди и входит в очередь первым.
Реализуйте интерфейс RejectedExecutionHandler и настройте процессор.
Как правильно настроить параметры пула потоков
интенсивный процессор
Оптимальное количество потоков = количество ядер процессора или количество ядер процессора ±1.
Интенсивный
Оптимальное количество потоков = ((время ожидания потока, время процессора потока)/время процессора потока) * количество процессоров.
Как настроить пул потоков на основе ThreadPoolExecutor
Интерпретация исходного кода FutureTask
Реализация FutureTask на основе LockSupport
Реализация FutureTask на основе ожидания/уведомления
Интерпретация исходного кода ForkJoin
Параллельная разработка программирования
механизм кражи работы
Принцип Fork Join
Интерпретация исходного кода Threadlocal
Что такое Threadlocal
Сценарии применения Threadlocal
1. Класс шаблона транзакции Spring.
2. Получите httprequest
3. Цепочка вызовов Aop передает параметры
Разница между Threadlocal и Synchronized
Как предотвратить утечки памяти Threadlocal
1. Вызовите метод удаления
2. При использовании метода set предыдущий ключ будет очищен и станет нулевым.
Интерпретация исходного кода платформы микросервисов
Интерпретация исходного кода SpringBoot
Как работает автоматическая настройка SpringBoot
Интерпретация исходного кода основного модуля SpringBoot
Интерпретация исходного кода аннотации ядра SpringBoot
Интерпретация исходного кода встроенного контейнера сервлетов SpringBoot
Развертывание пакета SpringBoot, управление эксплуатацией и обслуживанием
Как контейнеры сервлетов превосходят Webflux
Интерпретация исходного кода основного компонента SpringCloudNetfilix (первое поколение)
Регистрация и интерпретация исходного кода службы Eureka
Продление услуги Эврика (пульс)
Удаление серверной службы Eureka
Механизм самозащиты сервиса Eureka
Что, если услуга отключится?
Локальные службы используют механизм повтора
Локальная служба реализует аварийное переключение адреса
Офлайн-уведомление сервиса Eureka
Синхронизация данных кластера Eureka
Интерпретация исходного кода вызова декларативной службы Fegin
Hystrix реализует ограничение рабочего тока, понижение версии и интерпретацию исходного кода автоматического выключателя.
Подробное объяснение унифицированного шлюза Zuul, маршрутизации услуг, интерпретации исходного кода фильтра.
Интерпретация исходного кода центра распределенной конфигурации Config
Интерпретация исходного кода отслеживания распределенных ссылок Sleuth
Подробное объяснение балансировки нагрузки ленточного клиента и анализ исходного кода
Интерпретация исходного кода SpringCloudAlibaba (второе поколение)
Интерпретация исходного кода центра распределенной регистрации Nacos
Регистрация и обнаружение услуг
Регистрация и интерпретация исходного кода службы Nacos
Принцип регистрации услуги
эврикаКлиент
Используйте jerseyClient для отправки запроса на регистрацию
эврикаСерверная сторона
Используйте ConcurrentHashMap для кэширования адресов интерфейса.
ключ — это имя службы
значение — это адрес интерфейса кэша
Обнаружение пульса службы Naocs и интерпретация исходного кода обновления
По умолчанию EurekaClient отправляет пакет обновления каждые 30 секунд, чтобы продлить время и сообщить EurekaServer, что я все еще жив.
По умолчанию EurekaServer ищет адреса с истекшим сроком действия в адресе кэша каждые 60 секунд, сохраняет их в новой коллекции и использует случайный алгоритм для их очистки.
Служба Naocs в автономном режиме и интерпретация исходного кода проверки работоспособности
Интерпретация исходного кода алгоритма выборов Raft кластера Nacos
Механизм обработки длинных опросов сервера Nacos
Принцип синхронизации данных между узлами кластера Nacos
Интерпретация исходного кода режима AP в Nacos
Интерпретация исходного кода режима CP в Nacos
Разделенное решение кластера Nacos
Центр распределенной конфигурации
Принцип реализации центра распределенной конфигурации Nacos
Как динамически обновлять файлы конфигурации в Nacos
Шлюз Интерпретация исходного кода микросервисного шлюза нового поколения
Почему производительность Gateway лучше, чем производительность Zuul?
Анализ исходного кода динамической маршрутизации шлюза
Укажите маршрут сопоставления правил времени
маршрут сопоставления файлов cookie
Маршрут соответствия заголовка
Маршрут соответствия хоста
Метод запроса, соответствующий маршруту
Запросить путь, соответствующий маршруту
Анализ исходного кода шлюзового фильтра
Пользовательский фильтр шлюза
Gateway интегрирует Nacos для достижения балансировки нагрузки
Gateway интегрирует Sentinel для реализации ограничения тока шлюза.
Интерпретация исходного кода платформы распределенных транзакций Seata
Интерпретация исходного кода трех основных компонентов Seata для решения распределенных транзакций
Seata обратно генерирует оператор sql на основе таблицы undo_log и откатывает интерпретацию исходного кода.
Интерпретация исходного кода проекта глобальной блокировки транзакции филиала Seata
Интерпретация исходного кода GlobalTransactionalInterceptor
Как TM удаленно подключается к TC для получения интерпретации исходного кода глобального идентификатора транзакции
Углубленная интерпретация исходного кода передних и задних зеркал Seata
В чем разница между Seata и откатом LCN?
Интерпретация исходного кода платформы синхронизации распределенных данных канала
Интерпретация исходного кода общей архитектуры канала
Анализ архитектуры принципа репликации MySQL «главный-подчиненный»
Как Canal делает вид, что подписывается на файлы BinLog с узлов
Принципы проектирования EventParser и EventSink
Принцип построения дополнительной подписки/потребления канала
Оптимизация производительности синхронизации данных с высокой степенью одновременности каналов
Как уменьшить задержку синхронизации между данными
Как избежать согласованности последовательности сообщений синхронизации данных
Как избежать проблемы потери синхронизации данных
Страж
изоляция сервисов
Алгоритм ограничения тока
ведро жетонов
дырявое ведро
Реализовано на основе семафора Semaphore
Исправлено окно подсчета
раздвижное технологическое окно
Правила управления потоком
Потоки
Реализовано на основе семафора Semaphore
количество запросов в секунду
ведро жетонов
Хайстрикс
Правила управления потоком
Изоляция семафора
В Сентинеле
количество запросов в секунду
ведро жетонов
Изоляция пула потоков
Дефекты потребляют ресурсы процессора
Метод ограничения тока
Google Гуава (ограничитель скорости)
Алибаба Сентинел
Нгинкс
Redis lua реализует ограничение тока
Рекомендуется ограничение тока сделать на nginx или шлюзе.
Интерпретация исходного кода платформы сбора данных
Хэш (хэш-функция) Интерпретация исходного кода платформы сбора карт
базовые знания
Разница между == и равными и базовая реализация
Зачем перезаписывать равно, а также переписывать хеш-код
Двоичное и десятичное преобразование/^ (операция исключающее ИЛИ)/>>> (сдвиг вправо без знака)/ & (операция И)
Низкоуровневая реализация
JDK1.7
Связанный список массива
Метод вставки головы (проблема с бесконечным циклом одновременного расширения)
Написание кода — это просто
JDK1.8
Связанный список массива красное черное дерево
метод вставки хвоста
Высококлассное написание кода
Преобразование красно-черного дерева
(Емкость массива >= 64 и длина связанного списка больше 8)
Количество красно-черных узлов дерева <6 связанного списка преобразования
Расчет хеш-функции
(h = key.hashCode()) ^ (h >>> 16)
я = (n - 1) и хэш
временная сложность
Ключ не конфликтует
Временная сложность O(1)
Ключевой конфликт
Хранилище связанного списка - O(N)
Хранилище красно-черного дерева равно O(LogN).
проблема столкновения хэш-кодов
Значения хэш-кода одинаковы, но значения контента разные.
Функции:
Ключ имеет значение null для хранения нулевой позиции массива.
Реализовано с использованием одностороннего связанного списка.
Неупорядоченное хэш-хранилище
Оптимизация производительности
Как избежать проблемы утечки памяти с помощью HashMap
Как HashMap снижает вероятность конфликтов хэшей
Как разумно указать размер начального значения коллекции в HashMap
HashMap общие вопросы на собеседовании
Почему нам следует переписывать метод HashCode при переписывании Equals?
Как HashMap позволяет избежать проблем с утечкой памяти
Как реализован нижний уровень HashMap1.7?
Где хранится HashMapKey, если он равен нулю?
Как реализован нижний уровень HashMap1.7?
Где хранится HashMapKey, если он равен нулю?
Как HashMap решает проблему конфликта хешей
Как реализовать проблему расширения массива с помощью HashMap
Использует ли нижний уровень HashMap одинарный или двусвязный список?
Временная сложность запроса HashMap на основе ключа
В чем разница между HashMap1.7 и 1.8?
Как избежать проблемы бесконечного цикла многопоточного расширения в HashMap1.8
Почему HashMap1.8 необходимо вводить красно-черные деревья?
Почему коэффициент загрузки 0,75 вместо 1
Как нижний уровень HashMap снижает вероятность конфликтов хэша?
Как HashMap наиболее эффективно хранит 10 000 ключей?
Каковы преимущества старших и младших битов HashMap и операций по модулю?
Почему бы просто не использовать ключ в качестве хеш-значения, а выполнить операцию XOR со старшими 16 битами?
Как хэш-функция реализована в HashMap?
Сохранен ли нижний слой HashMap в порядке? <br>
Как базовые слои LinkedHashMap и TreeMap обеспечивают упорядочение?
Как использовать HashMap в ситуациях с высоким параллелизмом
Принцип базовой реализации ConcurrentHashMap
Интерпретация исходного кода платформы сбора ConcurrentHashMap
базовые знания
синхронизировать и заблокировать
Как понять концепцию блокировки сегментации
Алгоритм CAS и изменчивость
базовая реализация
JDK1.7
структура данных
Блокировка сегментации массива Segments, реализация связанного списка HashEntry
Блокировка реализации
Замок замок CAS оптимистический замок класса UNSAFE
Реализация расширения мощностей
Поддерживает одновременное расширение нескольких сегментов.
Jdk1.8
структура данных
Используйте массив Node напрямую для сохранения данных
Связанный список массива красное черное дерево
Блокировка реализации
Отменить создание сегмента сегмента
Индекс не конфликтует и использует блокировку cas
Конфликты индексов используют синхронизированный
Реализация расширения мощностей
Поддержка одновременного расширения
Особенности: Поддержка многопоточности, высокая эффективность, по умолчанию разделена на 16 сегментов.
Функции:
ConcurrentHashMap не поддерживает нулевой ключ
Анализ исходного кода коллекции списков
Базовая реализация Arraylist
структура данных
множество
временная сложность
Временная сложность запроса индекса o(1)
Расширение
Расширение в 1,5 раза больше оригинала.
Не потокобезопасно
Преимущества и недостатки
Эффективность добавления и удаления низка и требует расширения, но эффективность запросов относительно высока.
Вектор, лежащий в основе реализации
структура данных
множество
временная сложность
Временная сложность запроса индекса o(1)
Расширение
Расширение в 2 раза больше оригинала
Безопасность резьбы
Базовая реализация LinkedList
На основе структуры данных связанного списка, сложность времени запроса индекса ()
структура данных
связанный список
временная сложность
Временная сложность запроса индекса log2(n) двоичный поиск
Не потокобезопасно
Преимущества и недостатки
Эффективность добавления, удаления и изменения высока, но эффективность запроса относительно низка.
Решения распределенной архитектуры
Проектирование и практика идемпотентной архитектуры микросервисов Интернета
Что такое идемпотентный план? Идемпотентный производственный фон
Тайм-аут ответа клиента
Когда время выполнения бизнеса очень велико, вместо этого рекомендуется использовать асинхронный режим mq.
политика повторных попыток
Решите основные причины идемпотентной проблемы сервисных интерфейсов.
уровень базы данных
Анализ причин идемпотентности на архитектурном уровне.
уровень шлюза
интерфейсный уровень
Заранее запросите, была ли выполнена бизнес-логика на основе глобального идентификатора.
Уровень БД
вставить уникальное ограничение аннотации типа
тип обновления оптимистический механизм блокировки
Действительно ли глобальный идентификатор гарантирует идемпотентность интерфейса?
Не обязательно, вам нужно учитывать уровень базы данных
Как обеспечить идемпотентность RPC-интерфейсов
глобальный идентификатор
Механизм блокировки (не рекомендуется из-за низкой эффективности)
Реализуйте идемпотентный дизайн на основе реальных бизнес-сценариев.
Проектирование и практика архитектуры распределенных замков в Интернете
В каких сценариях используются распределенные блокировки?
Проблема обеспечения идемпотентности планирования плановых задач.
Гарантированные флэш-продажи для предотвращения проблем с перепродажей
Основной принцип реализации распределенных блокировок
Стратегия повторной попытки
Подходит для ведения бизнеса очень быстро
Контроль тайм-аута
Дизайн продления жизни
Как избежать тупиковых проблем при продолжении жизни
Оптимизация производительности
Учитывайте стадный эффект
Высокая доступность
Установить таймаут блокировки
Детализация блокировки уменьшена.
справедливость
Тестирование совместимости распределенных блокировок и проект восстановления
Решение для реализации распределенной блокировки
Zookeeper реализует распределенные блокировки (режим CP)
Основная идея
Временный узел
уникальность пути
событие наблюдателя
Функции
Использовать режим cp
преимущество
Врожденное решение проблемы разделения мозга (более половины механизма)
Более надежный и стабильный
недостаток
Эффективность синхронизации данных кластера низкая
Низкая производительность
Два метода реализации
Реализовано на основе того же временного узла
Может возникнуть стадный эффект
Реализовано на основе временных последовательных узлов.
Избегайте проблем со стадом
Узел временного последовательного номера
Если текущий узел является наименьшим узлом, это означает, что блокировка получена успешно.
Если текущий узел не является самым маленьким узлом, подпишитесь на предыдущий узел.
Распределенная блокировка Curator Framework
Получить блокировку
Реализация на основе временной последовательной нумерации узлов.
Создайте временный узел последовательности, и замок получит тот, кто окажется наименьшим.
блокировать
Текущий узел временной последовательности, созданный вами, не самый маленький, подпишитесь на предыдущий узел
снять блокировку
Удалить узел временного последовательного номера
Трудности на собеседовании
Как выходит из строя главный узел zk и каковы последствия?
Происходит переизбрание ЗК, и вся среда ЗК временно недоступна.
Необходимо учитывать протокол Заб
Сначала сравните zxid, затем сравните myid
Как избежать проблемы взаимоблокировки клиента zk
zkserver не работает
Клиент zk устанавливает тайм-аут блокировки
После мониторинга простоя зк он активно просыпается.
клиент zk не работает
Врожденные характеристики zk позволяют избежать проблем взаимоблокировок и активно снимать блокировки.
Другие клиенты zk устанавливают таймаут блокировки
JVM, получившая блокировку, никогда ее не снимает.
Контролируйте количество продлений жизни, активно снимайте блокировку после нескольких продлений жизни, и транзакция будет отменена.
Redis реализует распределенную блокировку (режим AP)
Основная идея
Setnx реализует распределенную блокировку
Получить блокировку
Несколько jvms setnx одновременно. В конце концов, только одна jvm завершается успешно.
снять блокировку
Удалить ключ
Функции
Использовать режим точки доступа
преимущество
Поддержка высокого параллелизма
Эффективность в порядке
Использование метода асинхронной синхронизации данных
недостаток
Врожденная проблема разделения мозга (кластер Redis не имеет механизма большинства)
Не очень стабильный
Врожденный одиночный поток Redis может обеспечить потокобезопасность setnx.
Фреймворк Redisson
Получить блокировку
Создайте хеш-ключ с помощью сценария Lua.
снять блокировку
Удалить ключ
Дизайн продления жизни
По умолчанию сторожевой поток активируется каждые 10 секунд, чтобы предотвратить истечение срока действия ключа.
Трудности на собеседовании
Как избежать проблем взаимоблокировки клиента
Установить ключ с истекшим сроком действия
Ограничьте количество продлений жизни
Откат транзакции
Срок действия ключа истек, но бизнес еще не выполнен. Что делать?
Дизайн продления жизни
Глобальное продление жизни (не рекомендуется)
Постепенное продление срока службы (рекомендуется)
По умолчанию срок действия ключа продлевается заранее каждые 10 секунд, чтобы предотвратить истечение срока действия ключа.
Продлите жизнь несколько раз, чтобы ограничить количество продлений жизни из-за проблем с тупиковой ситуацией.
Откат транзакции
Активно снять блокировку
Что делать в кластере Redis, если главный узел не работает? <br>
Использовать алгоритм красной блокировки RedLock
В кластере Redis нет различия между главным и подчиненным устройствами.
Клиент соответствует более чем половине требований setnx для нескольких серверов Redis и успешно получает блокировку.
Если клиент устанавливает общее время, необходимое для получения блокировки, > срока действия ключа, блокировка будет автоматически снята.
Этот алгоритм фактически использует ZK для реализации распределенных блокировок.
Проектирование и практика архитектуры распределенных транзакций в Интернете
Предыстория распределенных транзакций
Несколько источников данных для одного проекта
jta Atomikos решает распределенные транзакции
Интерфейс удаленного вызова RPC
Протокол согласованности распределенных транзакций
Строгий протокол согласованности
В кластере данные копирования каждого узла должны быть согласованными.
Слабый протокол согласованности
В кластере некоторым репликам узлов разрешено иметь противоречивые данные.
протокол окончательной согласованности
Допускаются небольшие задержки данных, но в конечном итоге требуется согласованность данных.
Идеи дизайна распределенных транзакций
Базовая теория и теория CAP
Базовая теория
В принципе доступен<br>
мягкое состояние
конечная согласованность
КЕПКА
Основная теория
Консистенция (С)
В кластере данные копирования каждого узла должны быть согласованными.
Доступность(А)
После сбоя некоторых узлов в кластере может ли весь кластер по-прежнему отвечать на запросы клиента на чтение и запись?
Допуск разделения (P)
Отказоустойчивость раздела (P) в основном представляет собой ошибки, вызванные неизбежными колебаниями сети, и эти три режима не могут быть достигнуты одновременно, поэтому в настоящее время существует только два режима: режимы CP и AP.
Выбор режима
CP (гарантированная согласованность данных)
Наличие не гарантировано
Ап (гарантированная доступность)
Однако целостность данных каждой копии не может быть гарантирована<br>
Сравнительный анализ
Накос
Nacos поддерживает кластеры смешанного режима CP/AP, начиная с версии 1.0. По умолчанию — режим Ap.
Эврика
Режим приложения
Работник зоопарка
Режим Cp
Центр регистрации рекомендует режим Ap.
Гибкие и жесткие дела
Жесткие транзакции удовлетворяют теории ACID
Гибкие транзакции удовлетворяют теории BASE (в основном доступны, в конечном итоге непротиворечивы)
2ПК/3ПК/TCC<br>
Структура разрешения распределенных транзакций
LCN решает проблемы распределенных транзакций
Seata решает проблемы распределенных транзакций
MQ решает проблемы распределенных транзакций
TCC решает проблемы распределенных транзакций
Повторите метод обратного вызова для решения проблем с распределенными транзакциями<br>
Проектирование и практика архитектуры распределенного планирования задач в Интернете
Недостатки традиционных запланированных задач
Потреблять ресурсы процессора
Отсутствие развязки влияет на бизнес-логику
Основные идеи проектирования распределенного планирования задач
Прослеживаемость журналов
Гибкое расширение и сжатие
Поддержка параллельного планирования
Стратегия высокой доступности
Стратегия обработки сбоев
Стратегия динамического шардинга
Платформа распределенного планирования задач
Интерпретация исходного кода XXLJob
Интерпретация исходного кода ElasticJob
протокол согласованности данных mysql и Redis
решение
1. Обновите данные MySQL и вручную очистите кеш Redis.
Преимущества: низкая задержка.
Недостатки: Не развязан.
2. Обновите данные MySQL и синхронизируйте данные с Redis в асинхронной форме mq.
Преимущества: реализация развязки, стратегия компенсации повторных попыток, улучшение отклика интерфейса.
Недостатки: высокая задержка.
3. Синхронизация данных с Redis на основе подписки на MySQLBinLog в сочетании с асинхронной формой mq (реализация инфраструктуры канала).
Преимущества: больше развязки, стратегия компенсации повторных попыток, улучшенный отклик интерфейса.
Недостатки: Задержка становится все выше и выше.
Основные идеи дизайна
Идея итоговой согласованности заключается в том, что допускается временная несогласованность данных, но окончательные данные должны быть согласованными.
Принцип протокола согласованности двойной записи
Сначала удалите кеш, а затем обновите базу данных (не рекомендуется)
Нужно отложить двойное удаление, удалить дважды
Удалить кэш в первый раз
Во второй раз, чтобы избежать одновременного выполнения других потоков, синхронизируйте грязные данные чтения с Redis, поэтому задержитесь на несколько секунд (время, когда второй поток обновляет старые данные в Redis), чтобы удалить кеш.
Сначала обновите БД, затем удалите кеш
Его необходимо объединить с mq и обеспечить согласованность последовательности сообщений. Удаление кеша должно быть успешным.
Протокол согласованности DoubleWrite
Что такое двойное письмо
Сначала обновите базу данных, затем обновите кеш
Какие проблемы возникнут
В параллельной ситуации несколько потоков выполняют запись одновременно. Другой поток может записывать в кеш «грязные» данные чтения.
Как решить проблему грязного чтения
Используя механизм блокировки строки транзакции MySQL, несколько потоков выполняют операции записи одновременно. В конце концов, только один поток получает блокировку строки. После получения блокировки строки Redis должен быть успешно синхронизирован, прежде чем блокировку строки можно будет снять. темы могут писать
Реализовано с использованием распределенных блокировок (не рекомендуется, может быть реализовано непосредственно на основе блокировок строк MySQL)
Принцип конструкции каркаса канала
канал решает принцип синхронизации данных между MySQL и Redis
1.canal маскируется под подчиненный узел MySQL и подписывается на файл binlog главного узла MySQL;
2. Когда файл binlog нашего главного узла mysql изменяется, файл binlog<br> отправляется на сервер канала;
3. Сервер канала преобразует файл binlog в формат json и отправляет его клиенту канала;
4. Клиент канала синхронизирует данные с Redis/ES;
режим синхронизации канала
TCP (низкая эффективность)
кафка (рекомендуется)
Как повысить эффективность канала, интегрирующего синхронизацию данных Kafka
Интегрируйте режим темы MQ
Одна тема и один раздел (строгий порядок глобального бинлога)
Один раздел с несколькими темами может обеспечить порядок на уровне таблицы.
Таблица с тем же именем помещается в один и тот же раздел и в конечном итоге используется одним и тем же потребителем.
Одна тема, несколько тем, несколько разделов в сочетании с режимом хеширования
Как решить проблему согласованности последовательности сообщений
Настройте несколько разделов и рассчитайте хеш на основе полей в таблице, таких как идентификатор первичного ключа. Один и тот же идентификатор будет помещен в один и тот же раздел и использован одним и тем же потребителем.
Есть ли задержка при синхронизации данных между MySQL и Redis?
Во время процесса синхронизации данных произойдет небольшая задержка, это нормально. Трудно добиться сильной последовательности и следовать идее конечной последовательности.
Принцип промежуточного программного обеспечения с распределенными сообщениями
Базовая концептуальная модель MQ
Синхронный и асинхронный
Ограничение пикового трафика
Масштабируемость/развязка
Буферизация/восстанавливаемость
производители и потребители
Общие решения MQ
Как MQ позволяет избежать накопления сообщений
Увеличение потребительской ставки (кластер)
Потребители получают сообщения пакетами
Как MQ позволяет избежать повторного потребления потребителями (идемпотентная проблема)
Бизнес-сценарии Global ID обеспечивают уникальность
Как MQ гарантирует, что сообщения не будут потеряны?
Механизм подтверждения сообщения
Упорство
подтверждение сообщения
Как MQ обеспечивает согласованность последовательности сообщений
Привяжите одного и того же потребителя и очередь
Модель архитектуры MQ push и pull
Как производители получают результаты потребления
Асинхронно возвращает глобальный идентификатор, а интерфейсная часть использует ajax для регулярных активных запросов.
Основная платформа MQ
кроликMQ
Архитектурные мысли
Центр платформы управления Rabbitmq
Виртуальные хосты
Храните очереди сообщений в отдельных путях командной разработки.
Обмен
сообщение о распределении маршрута
ключ маршрутизации
Модель очереди RabitMQ
простой режим<br>
Режим работы
Режим трансляции --- разветвление
Режим маршрутизации --прямой
Режим темы — тема
RabitMQ четыре типа переключателей
Прямой обмен (прямой переключатель)
Обмен разветвлениями
Обмен темами
Обмен заголовками
Общие вопросы для собеседований по RabbitMQ
Как RabbitMQ гарантирует, что сообщения не будут потеряны
режиссер
Убедитесь, что производитель успешно доставил сообщение на сервер MQ.
Механизм подтверждения сообщения подтверждения (Confirms)
Синхронная или асинхронная форма
Сообщения о транзакциях
потребитель
Режим ручного получения потребления
Автоматическая подпись (не рекомендуется)
Ручная подпись (рекомендуется)
Сохранение сообщений MQ на стороне сервера
Очередь недоставленных писем RabbitMQ
Сообщение доставлено в MQ и сохранено. Срок действия сообщения истек.
Контейнер очереди заполнен
Если потребителю не удается обработать несколько сообщений, они будут переведены в очередь недоставленных писем.
Механизм автоматического повтора сообщения RabbitMQ
Что делать, если после нескольких попыток все равно не получается?
Перейти в очередь недоставленных писем
Запишите в таблице журнала плановую компенсацию или компенсацию вручную.
Как избежать проблем потребительской идемпотентности?
Бизнес-сценарии Global ID обеспечивают уникальность
Кафка
Модель проектирования базовой архитектуры Kafka
Брокер (на стороне сервера MQ)
Тематика (темы классифицируются по бизнесу)
Partiiton (сообщение о хранилище раздела)
Режиссер
Потребитель
Потребительская группа
Реплика (механизм репликации)
Смещение (запись потребления)
Почему Kafka может поддерживать высокий уровень параллелизма
уровень структуры хранения
Сообщения будут сжиматься для уменьшения пропускной способности передачи.
Модель структуры хранения разделов Kafka
Файл сообщений хранилища .log
.index хранит индекс сообщения
.timeIndex, файл индекса времени
Сегментированный журнал хранения (сегментный файл)
Используйте разреженный индекс, чтобы найти физическое местоположение сообщения (для каждого сообщения индекс не создается).
Преимущества: Экономия места.
После того, как сообщение будет сохранено, оно не будет удалено сразу после успешного использования. Сообщение получается на основе смещения (необходимо учитывать настройку стратегии очистки журнала).
уровень Java-приложения
режиссер
Производители доставляют сообщения пакетами (проектирование буферного пула).
потребитель
Потребители получают сообщения пакетами (несколько смещений).
Один потребитель на раздел (масштабируемость)
уровень ядра Linux
Используйте последовательное чтение и письмо.
Использовать механизм нулевого копирования
режим пользователя sendfile mmap и отображение режима ядра
Нет необходимости в процессоре для копирования данных
Уменьшите количество переключений между пользовательским режимом и режимом ядра.
Используйте Page Cache для улучшения чтения и записи.
Необходимо рассмотреть вопрос чистки дисков
Как Kafka обеспечивает надежность сообщений
Репликация
Надежный механизм реплики ISR
Реплика выборов в разделе
Верхняя граница HW: максимальная компенсация, которую могут потреблять потребители.
Наибольшее значение смещения в очереди LEO
Производитель доставляет подтверждение сообщения
0 означает, что производитель не ждет (сообщения могут быть потеряны)
1 означает, что производитель ожидает, а лидер очищает диск (рекомендуется конфигурация по умолчанию)
-1 означает, что производителю необходимо дождаться синхронизации всех узлов.
Принцип контролера принципа выборов Кафки
Использование временных узлов Zookeeper для проведения выборов
Потребитель вручную отправляет компенсацию
Как Кафка находит сообщение с указанным смещением?
1. Поиск сегментов файлов по смещению (двоичный поиск).
2. Получите доступ к индексному файлу (разреженный индекс) и найдите соответствующее физическое место хранения.
3. В соответствии с физическим местоположением доступа откройте журнал, чтобы найти соответствующее физическое сообщение.
Найдите значение индекса сообщения
Возврат физических сообщений напрямую (временная сложность o(1))
Значение индекса сообщения не найдено
Поиск по порядку (временная сложность o(N))
Оптимизация производительности Kafka
режиссер
Размер буфера памяти производителя
Политики повтора «retries» и «retries.backoff.ms»
Этот параметр задает количество повторов и интервал.
Механизм подтверждения: acks. Для баланса рекомендуется установить значение 1.
потребитель
Количество потребительских разделов
Потребители получают сообщения пакетами на основе нескольких смещений.
Потребитель разрешает отправку смещения вручную
Брокер (на стороне сервера MQ)
Конфигурация политики хранения журналов
Стратегия очистки файла данных журнала
конфигурация репликации реплики
Оптимизация конфигурации сети и потоков ввода-вывода
Практическая оптимизация производительности MySQL
Оптимизация производительности MySQL
Архитектура MySQL и принципы процесса выполнения
Как выполняются операторы SQL
Встроенный кеш запросов
Грамматика и лексический разбор
семантический процессор
Оптимизатор/план выполнения
механизм выполнения запросов
Структура памяти InnoDb и структура диска
Буферная конструкция
Функция буферного пула
Буфер памяти переполнен, что делать?
Как настроить размер буферного пула?
Проблемы с задержкой MySQL и стратегии очистки данных
Как понять модуль абстрактной страницы данных в MySQL
Как страницы данных и страницы кэша на диске соответствуют друг другу?
Какова информация описания, соответствующая странице кэша?
Как правильно настроить пул буферов в зависимости от конфигурации машины
Какой объем памяти следует установить для пула буферов в производственной среде?
Общий размер = 2 раза (размер фрагмента * количество пулов буферов)
Принцип базового протокола связи MySQL
Linux
TCP/IP-сокет
сообщение MySQL
Трехсторонняя аутентификация посредством рукопожатия
Unix-сокет
окна
именованный канал
совместное использование памяти
Разделение базового модуля MySQL
Модуль инициализации
Основной API
Модуль сетевого взаимодействия
Модуль протокола взаимодействия клиента и сервера
пользовательский модуль
модуль контроля доступа
Управление соединениями, потоки соединений и управление потоками
Модуль анализа и пересылки запросов
Модуль оптимизатора запросов
Модуль регистрации
Интерфейсный модуль механизма хранения
Основной принцип реализации индекса MySQL
Модель структуры данных индекса
хеш-таблица
двоичное дерево поиска
красное черное дерево
Сбалансированное дерево поиска с несколькими ответвлениями
Б-деревья
Какие категории есть в индексе?
Полнотекстовый указатель
индекс первичного ключа
комбинированный индекс
уникальный индекс
Разница между innodb и myisam Разница в индексе<br>
Основные принципы создания и использования индексов MySQL
Основные принципы транзакций MySQL
Разница между декларацией Spring и транзакцией программирования
Какие проблемы возникнут, если транзакция только начинается и не фиксируется/откатывается?
Принцип многоверсионного управления mysql MVCC
Уровень изоляции транзакций MySQL
повторяемое чтение
прочитать фиксацию
Читать незафиксированные
сериализация
Принципы блокировки и снятия блокировки MySQL
Блокировка строки, блокировка таблицы, блокировка страницы
Пессимистическая блокировка/оптимистическая блокировка
Гэп Лок
Что такое блокировка зазора?
Почему блокировка пробелов является основной причиной предотвращения фантомного чтения на уровне изоляции RR?
Индекс первичного ключа/уникальный индекс Будет ли добавлена блокировка пробела к текущему чтению?
Будет ли добавлена блокировка пробела через запрос диапазона
Будет ли Gap добавлен к текущему чтению, если условия поиска не существуют?
Принцип анализа тупиковых ситуаций
Двухфазная блокировка
Почему возникает взаимоблокировка?
Основной принцип журнала MySQLUndo
Разница между журналом отмены и журналом повторного выполнения
UndoLog реализует принцип атомарности транзакций.
RedoLog реализует принцип сохранения транзакций
Практическая оптимизация производительности MySQL
Анализ медленных запросов SQL и решения
Как включить медленный запрос MySQL
Интерпретацию принципа выполнения плана поясняем
id: чем больше столбец, тем выше приоритет выполнения. Если идентификатор одинаковый, он будет выполняться сверху вниз. Если идентификатор равен NULL, он будет выполняться последним.
select_type: указывает тип запроса
таблица: объясните, к какой таблице обращается строка.
тип столбца
система
константа
eq_ref
ссылка
<p class="MsoNormal"><b><span style="font-family: "Times New Roman"; размер шрифта: 10.5pt;">диапазон </span></b></p>
индекс
ВСЕ
Экстра означает дополнительную информацию
Принципы SQL и оптимизации индексов
Следуйте правилу лучшего левого префикса, чтобы предотвратить сбой индекса.
Попробуйте использовать покрывающие индексы, чтобы избежать запросов к таблице.
Сортировка осуществляется по методу наилучшего левого префикса, чтобы избежать сортировки файлов.
Минимальный тип соответствует уровню запроса диапазона диапазона.
Оптимизация разбиения на страницы, при которой условие идентификатора отфильтровывается, или подзапрос находит ассоциацию идентификатора
Запрос таблицы соединения оптимизирует небольшие таблицы для управления данными больших таблиц. Запрещено использовать соединение более чем для трех таблиц.
Например, нечеткий следует правилу лучшего левого префикса или использует нечеткий запрос составного индекса.
Принципы оптимизации конфигурации MySQL
Оптимизация механизма хранения и структуры таблиц
Руководство по разработке Alibaba Оптимизация MySQL с точки зрения
Таблица и база данных MySQL
Когда отдельная таблица достигнет максимального размера, она будет разделена на таблицы и базы данных.
Разница между горизонтальным и вертикальным разделением
Стратегия подтаблицы и подбазы данных
Остаток/диапазон по модулю
Разделить по диапазону
Разделить по дате
Разбить по месяцам
Сегментирование по значению перечисления
Нарезка диапазона двоичного модуля по модулю
Согласованное хеширование
Раздел, указанный префиксом целевого поля<br>
Сегментируйте диапазон по модулю в соответствии с префиксным кодом ASCII и значением.
Настройка разработчика
Общая проблема
Каковы преимущества и недостатки запросов после разделения таблиц и баз данных?
Как реализовать страничный запрос после разделения таблиц и баз данных
Как реализовать запрос к объединенной таблице после разделения таблиц и баз данных
Почему MyCat не рекомендуется
Углубленная интерпретация исходного кода Netty
Концептуальная основа сетевой модели
Модель пятиуровневой архитектуры TCP/IP
Прикладной уровень
транспортный уровень
Сетевой уровень
канальный уровень
физический слой
Программирование сокетных сетей
TCP-протокол
UDP-протокол
Как решить проблему с IP-адресом, введя URL-адрес
Основные принципы протокола HTTP
Принцип запроса и ответа по протоколу HTTPS
Принципы HTTPS и SSL/TLS
Разница между протоколом http и Socket
Принцип модели ввода-вывода
Блокирующая модель ввода-вывода
Неблокирующая модель ввода-вывода
Модель мультиплексного ввода-вывода
Модель ввода-вывода, управляемая сигналами
Модель асинхронного ввода-вывода
Разница между НИО и БИО
Основные принципы ОИО
Эволюция от BIO к NIO
Потоково-ориентированный и буферно-ориентированный
Блокировка и неблокировка
Принцип реализации NIO (ядро операционной системы)
Основная концепция
буфер ядра
буфер процесса
ядро Linux
выбирать
Временная сложность равна O(n), и существуют определенные ограничения на мониторинг файловых дескрипторов.
голосование
Временная сложность равна O(n), и нет ограничений на прослушивание файловых дескрипторов.
эполл
Временная сложность равна O(1), и нет ограничений на прослушивание файловых дескрипторов.
Интерпретация исходного кода Netty
Общие сценарии использования Netty
Структура RPC
Томкат-сервер
Онлайн игра
Принцип архитектуры NIO
буфер
Селектор
ряд
Высокопроизводительный дизайн Netty
Асинхронная неблокирующая связь
Нулевой пул копирования/памяти
MMAP запись
Отправить файл
О чем стоит подумать:
Как уменьшить количество копий процессора
Принцип прямого копирования DMA в память
Как уменьшить количество переключателей ядра
Эффективная модель потоков Reactor
Одиночный реактор, один поток
Многопоточность с одним реактором
Модель главного-подчиненного реактора
Концепция серийного дизайна без блокировки
Поддержка платформы сериализации
Интерпретация исходного кода Netty
Модель потока Netty и анализ исходного кода
Высокопроизводительный протокол сериализации protobuf и анализ исходного кода
Явление и решение распаковки липких пакетов, анализ исходного кода кодека
Подробное объяснение прямой памяти и нулевой копии Netty.
Практика использования Netty Framework
На основе рукописной структуры RPC Netty (высокая имитация Dubbo).
На основе рукописной многопользовательской онлайн-игры Netty в нарды.
На основе рукописного веб-сервера Netty (высокая имитация Tomcat)
Анализ принципов ядра системы Linux
Работа по подготовке ядра Linux
Краткий анализ архитектуры ядра Linux
Разница между архитектурой Linux и структурой ядра
Механизм платформы под управлением Linux
Архитектура ядра Linux
Интерпретация исходного кода Spring System Framework
Интерпретация исходного кода Spring5
Интерпретация исходного кода SpringMVC
Интерпретация исходного кода SpringBoot
Новый проект розничной электронной коммерции
Идеи архитектурного дизайна
Новая концепция розничной торговли<br>
План технической архитектуры
SpringBoot
ВеснаОблакоAlibaba
Промежуточный дизайн
Технологический центр
Бизнес центр
Организационный центр
облачные вычисления
SaaS (Программное обеспечение как услуга)
PaaS (сервис платформы)
IaaS (инфраструктурные услуги)
Интеграция эксплуатации и разработки Devops и K8S
апм
Внедрить отслеживание услуг
Мониторинг сигнализации
Разделение передней и задней части
Фронтенд ----- vue похож на технологию ajax и реализуется фронтенд-инженерами.
Бэкэнд ------ Форма интерфейса Бэкэнд-инженер реализует Java
Создание инфраструктурных услуг
Развертывание центра регистрации/конфигурации службы Nacos.
Создайте частный сервер Maven корпоративного уровня.
Реализовать вызов интерфейса RPC в микросервисной команде.
Определить протокол спецификации интерфейса API
Создайте платформу управления хранилищем кода корпоративного уровня.
po/do/vo/dto/bo выберите приложение
Целью является обеспечение безопасности данных, передаваемых RPC.
Выберите приложение
DO (Объект данных): соответствует структуре таблицы базы данных «один к одному» и передает объекты источника данных вверх через уровень DAO.
DTO (объект передачи данных): объект передачи данных, объект, передаваемый извне службой или менеджером.
BO (Бизнес-объект): Бизнес-объект. Объект, инкапсулирующий выходные данные бизнес-логики уровня сервиса.
AO (объект приложения): объект приложения. Абстрактная объектная модель повторного использования между веб-слоем и уровнем обслуживания.
VO (Объект просмотра): объект уровня отображения, обычно объект, передаваемый через Интернет на уровень механизма рендеринга шаблона.
Дизайн членского центра
Реализация интерфейса входа в систему
Почему бы не использовать сеанс
Когда сеанс сохраняется на сервере jvm, необходимо учитывать проблему синхронизации кластера узлов.
Метод реализации токена
Принцип реализации
Случайным образом сгенерируйте токен (UUID) в качестве ключевого значения Redis в качестве идентификатора пользователя.
Верните токен клиенту, и клиент вызывает интерфейс каждый раз, когда передает токен.
Преимущества и недостатки
преимущество
Скрыть подлинность параметра
недостаток
Необходимо выполнить запрос Redis
JWT-реализация
компоненты
заголовок (заголовок)
Полезная нагрузка
Подпись
Преимущества и недостатки
преимущество
Нет необходимости хранить пользовательские данные на сервере, что снижает нагрузку на серверную часть.
Легкий стиль JSON относительно прост.
перекрестный язык
недостаток
Невозможно обновить срок действия.
Невозможно уничтожить jwt
Как реализовать выход из системы в Jwt
Очистить куки браузера (но сервер все еще существует)
Рекомендуется установить время немного короче.
Интегрируйте многопоточность и пул потоков.
Используйте многопоточность для обработки электронных писем, текстовых сообщений и купонов, отправленных после входа в систему, тем самым повышая эффективность ответа интерфейса.
В крупных проектах используется асинхронная и трудоемкая обработка mq для сокращения ресурсов ЦП сервера.
Единый вход в систему
веб-форма
Реализовано на основе файлов cookie
Разделение передней и задней части
Реализовано на основе токена или jwt
Общая проблема
Как получить информацию об IP реального клиента
Установив реальный IP пользователя в nginx
Как решить междоменную проблему разделения фронтенда и бэкенда
Используйте jsonp, но не поддерживает запросы на публикацию (не рекомендуется)
Используйте аннотацию SpringMVC @CrossOrigin (рекомендуется)
Решение междоменных проблем на основе шлюза (рекомендуется)
Доступ на основе разных проектов на базе Nginx (рекомендуется)
Совместная реализация входа в систему
oauth2 открытый протокол
1. Сгенерировать адрес ссылки авторизации на основе appid
2. Получите код авторизации.
3. Получите accessToken на основе кода авторизации.
4. Получите информацию о пользователе на основе кода авторизации.
Распределенные решения
Недостатки традиционных журналов сбора
Используйте хвост для поиска журналов на каждом сервере
решение
aop elk kafka реализует распределенный сбор журналов
Почему лосю нужно добавить Кафку
Сократите затраты на эксплуатацию и обслуживание каждой установки Logstash.
Меры предосторожности
АОП кэширует собранные журналы в параллельной очереди и доставляет их в Kafka в отдельном асинхронном потоке.
Агрегированная схема оплаты
Процесс архитектуры платежей
Проверка метода подписи
Асимметричное шифрование RSA
MD5
метод обратного вызова
Синхронный обратный вызов
После того, как сторонний платеж будет успешным, он перейдет на сторону продавца в виде перенаправления платежного браузера.
Асинхронный обратный вызов
Сторонний платеж отправляет уведомления продавцам с использованием технологии, аналогичной HttpClient.
Шаблоны проектирования
шаблон стратегии
шаблон метода шаблона
Общая проблема
Как синхронные и асинхронные обратные вызовы обеспечивают безопасность интерфейса
Синхронный обратный вызов выполняется в виде браузера и не меняет статус заказа.
После того как асинхронный обратный вызов успешно проверит подпись, обратите внимание на проблему идемпотентности, чтобы изменить статус заказа.
Как запретить пользователям платить повторно
Тот же номер заказа передается из формы в сторонний платеж, а сторонний платеж обеспечит глобальную уникальность на основе номера заказа.
Что делать, если платеж пользователя прошел успешно, но статус заказа по-прежнему неоплачен?
Это нормальное явление. Благодаря идее конечной согласованности вы можете активно вызывать интерфейс Alipay, чтобы узнать, был ли оплачен заказ.
Как справиться с несоответствием суммы платежа пользователя и суммы заказа
В асинхронном обратном вызове на основе порядка будет запрошено, соответствует ли реальный номер заказа пользователя сумме платежа пользователя. <br> Если они несовместимы, это ненормальный заказ.
Какие типы полей суммы таблицы платежей подходят?
Прямое хранение целочисленных типов позже может быть преобразовано в элементы.
десятичный тип
Как обработать заказ, который не был оплачен в течение 30 минут сверхурочной работы
Реализовано на основе очереди задержки MQ (рекомендуется)
1. После успешного размещения заказа доставьте сообщение отложенной очереди в MQ.
2. По истечении срока действия сообщения оно будет переведено в очередь недоставленных писем.
3. Потребитель очереди недоставленных писем прослушивает сообщение и проверяет, оплачен ли заказ.
Реализовано на основе ключа Redis с истекшим сроком действия (не рекомендуется).
1. После успешного размещения заказа установите для Redis ключ со сроком действия 30 минут.
2. Когда клиент следит за сроком действия ключа, он проверяет, является ли заказ оплаченным.
3. Чтобы включить мониторинг истекшего ключа, нужно обратить внимание на префикс и подписаться на отдельную библиотеку Redis.
Общая проблема
Карта пользователя платит в течение 30 минут. Как обеспечить постоянство статуса заказа?
1. Установите таймаут перенаправления заказов Alipay на 30 минут.
2. Очередь задержки активно обращается к интерфейсу Alipay, чтобы проверить статус платежа на основе номера заказа примерно за 31-35 минут.
3. Если после вызова интерфейса Alipay оплата по-прежнему не произведена, заказ будет считаться трудоемким.
Проектирование архитектуры системы обслуживания продуктов
Как добиться устойчивости к высокому параллелизму
Внешний слой
Оптимизация
Архитектура динамического и статического разделения
Статический сервер ресурсов
сервер динамических ресурсов
Статическое сжатие ресурсов
Создать файл .min
CDN-кеш
Посещение по принципу близости
конечный эффект
Уменьшите пропускную способность передачи
интерфейсный уровень
Оптимизация
Настройка параметров JVM для уменьшения количества проблем, связанных с переработкой GC.
Обработка трудоемких операций в форме многопоточности/асинхронной развязки MQ.
Используйте кеш Redis, чтобы снизить нагрузку при доступе к БД.
Рассмотрите возможность разделения таблиц и баз данных/оптимизации индексов для больших данных MySQL.
конечный эффект
Уровень эксплуатации и обслуживания
Используйте Docker или K8S для гибкого расширения/сокращения развертывания.
JavaSE
базовая грамматика
тип данных
Основные типы данных
Числовой тип
Целое число (байт, короткое, целое, длинное)
Число с плавающей запятой (float,double)
персонаж (символ)
нечисловой тип
логическое значение
Справочный тип данных
сорт
интерфейс
множество[]
объектно-ориентированный
структура сбора
поток ввода-вывода
механизм отражения
Многопоточность
JDBC
JavaWeb
База
Сервлет
ДСП
рамка
Весна5
Отношения Spring5 и SpringBoot
Метод внедрения SpringBean
Метод внедрения SpringBean
Свойства, введенные параметрическим конструктором
p инъекция пространства имен
Внедрить нулевые значения и специальные символы
Внедрить внутренние бобы
Внедрить внешние bean-компоненты
Внедрить каскадное назначение
Внедрить свойства типа коллекции
Весенняя фабричная фасоль
Жизненный цикл SpringBean
Шаг 1. Используйте технологию отражения для инициализации объекта и вызова конструктора без аргументов.
Шаг 2. Используйте отражение для вызова метода set для присвоения значений свойствам.
Третий шаг выполнения: предварительный метод постпроцессора компонента.
Шаг 4. Вызовите метод init объекта.
Шаг 5: Пост-метод постпроцессора Бина
Шаг 6. Уничтожьте объект и вызовите метод уничтожения.
Область действия SpringBean
Синглтон-объект
Несколько объектов экземпляра
Автоматическое подключение SpringBean
Файл внешних свойств SpringBean
Форма аннотации SpringBean
Метод запуска аннотации SpringBean
Функция запуска аннотаций SpringBean
Конфигурация сканирования аннотаций SpringBean
Аннотации с автоподключением и квалификаторами
@Использование ресурса
SpringBean АОП
Основные понятия АОП
Основная роль АОП
Статический прокси и динамический прокси
Использование аннотации @AspectJ
Используйте aop для равномерной печати журналов
Операции транзакций SpringBean
Классификация сделок
Ручные транзакции
программирование имеет значение
Семь коммуникативных моделей поведения дел
PROPAGATION_REQUIRED (поведение распространения по умолчанию)
Если транзакция существует в текущем потоке, присоединитесь к текущей транзакции.
Если в текущем потоке нет транзакции, создайте новую транзакцию.
PROPAGATION_SUPPORTS
Если транзакция существует в текущем потоке, присоединитесь к текущей транзакции.
Если в текущем потоке нет транзакции, она будет выполнена без транзакции<br>способом.
PROPAGATION_MANDATORY
Если транзакция существует в текущем потоке, присоединитесь к текущей транзакции.
Выдает исключение, если в текущем потоке есть транзакция
PROPAGATION_REQUIRES_NEW
Если транзакция существует в текущем потоке, текущая транзакция будет приостановлена и будет создана новая транзакция.
PROPAGATION_NOT_SUPPORTED
Всегда выполняется нетранзакционным способом
ПРОПАГАЦИЯ_НИКОГДА
Всегда выполняется нетранзакционным способом, исключение будет выдано, если транзакция существует в текущем потоке.
PROPAGATION_NESTED
Если в текущем потоке есть транзакция, она будет вложенной.
SpringMVC
Мибатис
Спящий режим
микросервисы
SpringBoot2.0
Почему вам нужно использовать среду SpringBoot
Может помочь разработчикам быстро интегрировать сторонние платформы (принцип: инкапсуляция зависимостей Maven).
Удалите конфигурацию xml и полностью используйте аннотации (принцип: встроенный метод аннотаций в системе Spring)
Нет необходимости во внешнем Tomcat и внутреннем сервере реализации (принцип: язык Java поддерживает встроенный сервер Tomcat)
Разница между SpringBoot и SpringCloud
Зависимости SpringCloud и компоненты SpringBoot
Используйте SpringMVC для написания интерфейса протокола Http.
Spring Cloud — это комплексная платформа микросервисных решений.
Введение в введение зависимостей SpringBoot
весна-загрузка-старт-родитель,
весна-загрузка-стартер-веб
Роль @RestController
Все методы контроллера возвращают формат JSON.
Метод запуска SpringBoot
@EnableAutoConfiguration
@ComponentScan
@SpringBootApplication
Можно сканировать все классы текущего пакета или подпакетов.
SpringBoot интегрирует доступ к статическим ресурсам
Какой фреймворк шаблонизатора
Рендеринг Интернета, полезный для SEO-поиска
Интеграция шаблонизатора ftl
Интеграция шаблонизатора Thymeleaf
SpringBoot интегрирует источники данных
JdbcШаблон
мибатис
впадать в спячку
Интегрированное горячее развертывание SpringBoot
Интегрируйте инструменты разработчика
Реализация загрузчика классов
Интегрировать ломбок
Файл конфигурации интеграции SpringBoot
Используйте аннотацию @value для чтения файлов конфигурации.
Свойства конвертировать формат yml
@ConfigurationProperties
Использование заполнителя файла конфигурации
Интегрируйте различные файлы конфигурации в нескольких средах.
Изменить порт и контекстный путь
Интегрированная среда журналов SpringBoot
возврат в систему
log4j
Используйте aop для единообразной печати информации журнала.
Запланированные задачи SpringBoot
Интеграция запланированных задач с аннотацией @Scheduled
Задачи интеграции по времени в сочетании с выражениями Quartz
SpringBoot интегрирует асинхронную многопоточность
Обратите внимание на проблему недействительности @Async.
@Async интегрирует пул потоков
Интегрируйте глобальные исключения перехвата
Упаковать и запустить выпуск
Инструменты проекта
докер
основная концепция
Почему вам нужно использовать докер
Преимущества использования докера
Разница между контейнерами и виртуальными машинами
Установка среды
Установите докер в среде Linux
Установите докер в среде Win
Три основных элемента
Файл изображения
контейнер
склад
Зеркальный принцип
Принцип загрузки образа Docker
Принцип загрузки образа Docker
загрузочная файловая система
rootfs
Союз фс
Конфигурация образа с облачным ускорением
Ускоренное изображение Alibaba Cloud
Ускоренное изображение в облаке Huawei
HKUST Ускоренное зеркало
Общие команды Docker
docker --help (команда справки)
docker --version (просмотреть версию)
изображения докера (просмотреть изображения)
поиск докера (поиск изображения)
docker pull (загрузить изображение)
последняя -----отметьте последнюю версию файла изображения
докер-контейнер
docker run (запустить контейнер)
Docker Start запускает идентификатор контейнера
идентификатор контейнера остановки Docker
идентификатор контейнера docker rm
docker exec -it [ИДЕНТИФИКАТОР КОНТЕЙНЕРА] bash (введите контейнер)
журналы Docker --с 30 м CONTAINER_ID (просмотр журналов контейнера)
Docker Commit (созданный в файл образа на основе текущего контейнера)
Том данных Docker -v
Установите часто используемое программное обеспечение
Кот
docker run -p 8081:8080 -d tomcat:8
Нгинкс
docker run --name nginx81 -d -p 81:80
MySQL
docker create --name mysql3308 -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 mysql:5.7
DockerРазбор файлов
Спецификации записи DockerFile
Директива DockerFile
Создайте проект Springboot на основе Dockerfile.
Докер Составление
Составляйте общие команды
докер-компоновать -h
докер-составить
docker-compose вниз
docker-compose журналы
docker-compose pull
конфигурация dokcer-compose
перезапуск Docker-Compose
запуск docker-compose
Создать файл шаблона
Развертывание проекта микросервиса SpringBoot MySQL Nginx.
Использование инструмента визуализации Docker
Портейнер
DockerUI
к8с
метародная концепция
микросервисы
Спокойная связь между приложениями
Может быть независимо развернут/эластично расширен и уменьшен.
девопс
Автоматизированный конвейер выпуска, инструменты Ci/CD
Быстрое развертывание производственной среды
Интеграция разработки, эксплуатации и обслуживания
непрерывная доставка
Частые выпуски, быстрая доставка, быстрая обратная связь и снижение рисков выпуска.
Контейнеризация
Лучший оператор микросервисов
Шаблоны проектирования
режим прокси