предисловие
Привет всем, я маленький мальчик, который собирает улиток.
Друг дал интервью для внутреннего руководства бара вселенной. Я разобрал эти реальные вопросы и ответы на интервью, если есть ошибки, укажите на них. Золото, девять серебра и десять спринтов.
1. В заголовке http-запроса значение полей expire и cache-control, расскажите о коде состояния HTTP.
1.1 Значение полей expire и cache-control
- Cache-Control – это поле заголовка HTTP/1.1, которое используется для обозначения поддержки механизма кэширования. Этот атрибут поддерживают как заголовки запросов, так и заголовки ответов. Стратегия кэширования определяется различными значениями, которые она предоставляет. Есть
public、private、no-cache
эквивалент. - expires — это поле заголовка http1.0, время истечения срока действия, если время установлено, браузер будет напрямую читать кеш в течение установленного времени и больше не будет запрашивать.
1.2 Общие коды состояния HTTP
2. принцип https, цифровая подпись, цифровой сертификат.
2.1 Принцип https
- HTTPS = HTTP + SSL/TLS, то есть данные шифруются и расшифровываются с помощью SSL/TLS, а для передачи используется Http.
- SSL или Secure Sockets Layer — это протокол безопасности, который обеспечивает безопасность и целостность данных для сетевых коммуникаций.
- TLS, безопасность транспортного уровня (Transport Layer Security), является последующей версией SSL 3.0.
- Пользователь вводит URL-адрес https в браузере, а затем подключается к порту 443 сервера.
- Сервер должен иметь набор цифровых сертификатов, которые можно сделать самому или применить к организации, разница в том, что сертификат, выданный им самим, должен быть проверен клиентом. Этот сертификат на самом деле представляет собой пару открытого ключа и закрытого ключа.
- Сервер отправляет клиенту собственный цифровой сертификат (содержащий открытый ключ).
- После того, как клиент получит цифровой сертификат с сервера, он проверит его, и в случае неудачи появится окно с предупреждением. Если с сертификатом все в порядке, сгенерируйте ключ (симметричное шифрование) и зашифруйте его с помощью открытого ключа сертификата.
- Клиент инициирует второй HTTP-запрос в HTTPS и отправит зашифрованный ключ клиента на сервер.
- После того, как сервер получает зашифрованный текст, отправленный клиентом, он асимметрично расшифровывает его с помощью собственного закрытого ключа, получает ключ клиента после расшифровки, а затем использует ключ клиента для симметричного шифрования возвращенных данных, так что данные становятся зашифрованным текстом.
- Сервер возвращает зашифрованный зашифрованный текст клиенту.
- Клиент получает зашифрованный текст, возвращенный сервером, и симметрично расшифровывает его своим собственным ключом (клиентским ключом), чтобы получить данные, возвращенные сервером.
2.2 Цифровая подпись, цифровой сертификат
понялПринцип HTTPSВсе мои друзья знают о цифровых сертификатах. Чтобы предотвратить подделку открытого ключа, вводятся цифровые сертификаты, а именно:
Состав цифрового сертификата
- Открытый ключ и личная информация шифруются с помощью алгоритма Hash для формирования дайджеста сообщения; дайджест сообщения передается в надежный центр сертификации (ЦС), а его закрытый ключ используется для шифрования дайджеста сообщения для формирования цифровой подписи.
- Открытый ключ, личная информация и цифровая подпись вместе составляют цифровой сертификат.
3. Какие статусы tcp соединения между клиентом и сервером, и статус time_wait
3.1 TCP-соединение
Когда tcp подключен, клиент-клиент имеетSYN_SEND
,ESTABLISHED
Статус, сервер сервер имеетSYN_RCVD
,ESTABLISHED
государство.
И клиент, и сервер находятся в состоянии ЗАКРЫТО, а затем сервер начинает прослушивать порт и переходит в состояние ПРОСЛУШИВАНИЕ.
- Первое рукопожатие (SYN=1, seq=x), после отправки клиент переходит в состояние SYN_SEND
- После отправки второго рукопожатия (SYN=1, ACK=1, seq=y, ACKnum=x+1) сервер переходит в состояние SYN_RCVD.
- Третье рукопожатие (ACK=1, ACKnum=y+1), после отправки клиент переходит в состояние ESTABLISHED, когда сервер получает пакет, он также входит в состояние ESTABLISHED, и рукопожатие TCP может начать передачу данных.
3.2 статус time_wait
Вы можете вспомнить четыре волны TCP во-первых,
- Первая волна (FIN=1, seq=u), после отправки клиент входитFIN_WAIT_1государство
- Вторая волна раздач (ACK=1, ack=u+1, seq=v), после отправки сервер входитCLOSE_WAITсостояние, после того как клиент получает этот пакет подтверждения, он входитFIN_WAIT_2государство
- Третья волна (FIN=1, ACK1, seq=w, ack=u+1), после отправки сервер входитLAST_ACKсостояние, ожидая последнего ACK от клиента.
- Четвертая волна (ACK=1, seq=u+1, ack=w+1), клиент получает от сервера запрос на закрытие, отправляет пакет подтверждения и входитTIME_WAITсостояние, после ожидания в течение фиксированного времени (два максимальных жизненных цикла сегмента, 2MSL, 2 максимального времени жизни сегмента) со стороны сервера не получено ACK, считается, что серверная сторона нормально закрыла соединение, поэтому также закрывает соединение и переходит в состояние ЗАКРЫТО. После того, как сервер получает этот пакет подтверждения, он закрывает соединение и переходит в состояние CLOSED.
Почему состояние TIME-WAIT должно ждать 2MSL
2MSL, 2 максимального времени жизни сегмента, то есть два максимальных жизненных цикла сегмента
- 1 MSL гарантирует, что последнее сообщение ACK стороны, которая активно закрывает руки после четырех волн, может, наконец, достичь партнера.
- 1 MSL гарантирует, что одноранговый конец не получит ACK, поэтому может прийти повторно переданное сообщение FIN.
4. Что такое виртуальная память Что такое физическая память?
4.1 Что такое виртуальная память?
виртуальная память, виртуальная память, его основная идея состоит в том, чтобы гарантировать, что каждая программа имеет собственное адресное пространство, адресное пространство разделено на несколько блоков, и каждый блок имеет непрерывное адресное пространство. В то же время физическое пространство также разделено на несколько блоков.Размер блока такой же, как размер блока виртуального адресного пространства.Операционная система автоматически сопоставит виртуальное адресное пространство с физическим адресным пространством.Только программа необходимо обратить внимание на виртуальную память, и запрошенная виртуальная память также используется, это физическая память.
4.2 Что такое физическая память
Физическая память относится к пространству памяти, полученному с помощью физических карт памяти, а виртуальная память относится к разделению области жесткого диска как памяти.
Размер физической памяти, о котором мы часто говорим, на самом деле относится к размеру карты памяти. Как правило, при покупке компьютера мы смотрим на емкость карты памяти, другими словами, если размер карты памяти составляет 100 ГБ, можно ли использовать эти 100 ГБ? Не обязательно,это больше зависит от разрядности адресной шины процессора.Если адресная шина всего 20 бит,то ее адресное пространство 1Мб.Даже если можно установить флешку на 100G,это бессмысленно,а может только как физическую память.Размер 1 МБ.
4.3 Как виртуальная память сопоставляется с физической памятью?
Как показано на рисунке ниже, в ЦП имеется блок управления памятью (Memory Management Unit), именуемый MMU. Виртуальная память не отправляется напрямую на шину памяти, а сначала передается в MMU. виртуальный адрес на физический адрес.Программе нужно только хорошо управлять виртуальной памятью, а логика сопоставления, естественно, обрабатывается автоматически другими модулями.
5. Сколько tcp-соединений может установить машина максимум, на стороне клиента, на стороне сервера, что делать, если оно превышает
- Клиентская машина TCP-соединения: Теория TCP-соединения, которое может быть установлено каждым IP-адресом, ограничена параметром ip_local_port_range, а также ограничена 65535. Но вы можете расширить свои возможности по установлению соединений, настроив несколько IP-адресов.
- Машина сервера соединений TCP: хотя теоретическое значение каждого порта прослушивания велико, это число не имеет практического значения. Максимальное количество параллелизма зависит от размера вашей памяти, и каждое статическое TCP-соединение должно потреблять около 3
.3К памяти.
6. Принцип эврики, будь то сильная согласованность, кластер эврики. Можно ли вызвать службу, когда она не работает? Сравнение Эврики и ZooKeeper
6.1 архитектура эврика
Реестр является одним из основных компонентов распределенной разработки, а eureka — это реализация реестра, рекомендованная Spring Cloud.
Схема архитектуры выглядит следующим образом:
- Eureka Server: обеспечивает регистрацию и обнаружение служб, а данные синхронизируются между несколькими серверами Eureka для достижения согласованного статуса.
- Поставщик услуг: поставщик услуг, который регистрирует свои собственные услуги в Eureka, чтобы потребители услуг могли найти
- Потребитель услуг: потребитель услуг, получает список зарегистрированных услуг от Eureka, чтобы он мог потреблять услуги.
6.2 Схема архитектуры Eureka на основе кластера
Сервер Eureka может быть развернут в кластерах, а синхронизация данных будет выполняться между несколькими узлами через Replicate (асинхронный режим) для обеспечения данных.окончательная согласованность. В качестве стандартного реестра сервисов Eureka Server предоставляет такие функции, как регистрация сервисов, получение пульса сервисов, отбраковка сервисов, автономный сервис и т. д.
После запуска службы она регистрируется в Eureka, а Eureka Server синхронизирует регистрационную информацию с другими серверами Eureka.Когда потребитель службы хочет позвонить поставщику службы, он получает адрес поставщика службы из реестра службы, а затем кэширует службу. адрес провайдера в Local, при следующем вызове он будет взят прямо из локального кеша для совершения звонка.
6.3 Можно ли вызвать службу, когда она не работает?
Эврика виснет, микросервисы можно настроить, но есть посылка:адрес провайдера не изменился! Если поставщик изменит IP-адрес или порт, в это время потребитель не сможет воспринять изменение во времени и не сможет приспособиться.
6.4 Сравнение Eureka и ZooKeeper
- Zookeeper гарантирует CP (непротиворечивость и отказоустойчивость разделов), но не гарантирует доступность.недоступениз.
- Eureka гарантирует AP (доступность и отказоустойчивость раздела), она отдает приоритет гарантиямДоступность, выход из строя нескольких узлов не повлияет на работу обычных узлов.
7. Понимает ли Hystrix? Расскажите о том, как работает Hystrix
Рабочий процесс Hystrix выглядит следующим образом:
- команда сборки
Hystrix предоставляет две команды, HystrixCommand и HystrixObservableCommand, которые можно использовать для переноса выполняемых задач.
- Выполнение заказа
Есть четыре способа выполнить команду. Они есть:
- R execute(): выполнение синхронно, получение одного объекта результата от зависимых служб.
- Future queue(): асинхронное выполнение, возвращающее Future для получения результата выполнения, который также является одним объектом результата.
- ObservableObservable(): горячий наблюдаемый, после создания Observable он подпишется на Observable и может возвращать несколько результатов
- Observable toObservable(): холодный наблюдаемый, возвращает Observable, который будет выполняться только при подписке и может возвращать несколько результатов.
- Проверить кеш
Если Hystrix Cache включен, он сначала определит, есть ли кэш для выполнения той же команды, прежде чем задача будет выполнена. Если есть, вернуть кешированный результат напрямую; если нет кешированного результата, но кеш включен, текущий результат выполнения будет кеширован для последующего использования.
4. Проверьте, включен ли автоматический выключатель. Автоматический выключатель похож на предохранитель: предохранитель сработает в случае опасности для защиты цепи, а автоматический выключатель может вызвать короткое замыкание, когда достигнет установленного нами порога (например, частота отказов запросов достигает 50%), отклонение Выполнить любой запрос.
Если автоматический выключатель разомкнут, Hystrix не выполнит команду и перейдет непосредственно к логике резервной обработки.
5. Проверьте ситуацию с пулом потоков/семафором Методы изоляции Hystrix включают изоляцию пула потоков и изоляцию семафоров. При использовании пула потоков Hystrix Hystrix по умолчанию назначает 10 потоков каждой зависимой службе и отказывается выполнять команды, когда все 10 потоков заняты. Семафор тот же.
6. Выполняйте конкретные задачи Используйте HystrixObservableCommand.construct() или HystrixCommand.run() для запуска реальной задачи пользователя.
7. Рассчитайте работоспособность ссылки Каждый раз, когда выполнение команды запускается, выполнение команды завершается и возникает исключение, статус выполнения, такой как успех, сбой, отклонение и тайм-аут, будет записан.Эти данные будут обрабатываться регулярно, и то автоматический выключатель будет оцениваться в соответствии с заданными условиями устройства.
8. Выполнение резервной логики при сбое команды Выполнение заданной пользователем резервной логики в случае сбоя команды. Разрыв цепи, отклонение пула потоков, отклонение семафора, выполнение выполнения и тайм-аут выполнения на приведенном выше рисунке будут включены в обработку Fallback.
9. Вернуть результат выполнения Исходный результат будет возвращен в виде Observable, и перед возвратом пользователю будет выполнена некоторая обработка в соответствии с вызывающим методом.
8. Гарантия непротиворечивости Zookeeper, принцип протокола zab, к какой непротиворечивости принадлежит zookeeper, является ли она строгой согласованностью или окончательной согласованностью
Zab протокол, полное английское название — Zookeeper Atomic Broadcast (Зоокипер Атомный Вещание). Zookeeper гарантирует распределенные транзакции через протокол Zabокончательная согласованность.
Протокол Zab — это атомарный широковещательный протокол, специально разработанный для службы распределенной координации Zookeeper для поддержки восстановления после сбоев.Это основной алгоритм Zookeeper для обеспечения согласованности данных. Zab использует алгоритм Paxos, который является общим алгоритмом распределенного консенсуса.
На основе протокола Zab Zookeeper реализует системную архитектуру модели master-standby (т. е. модели Leader и Follower) для обеспечения согласованности данных между репликами в кластере. Это означает, что только один ведущий узел отвечает за обработку внешних запросов на запись транзакций, а затем он (лидер) синхронизирует данные с другими узлами-последователями.
Клиент Zookeeper случайным образом свяжется с узлом в кластере zookeeper.Если это запрос на чтение, он будет считывать данные непосредственно с текущего узла, если это запрос на запись, узел отправит транзакцию лидеру, а Лидер получает отправку транзакции. Транзакция будет транслироваться и будет зафиксирована до тех пор, пока более половины узлов не запишутся успешно.
Протокол Заб требует, чтобы каждый Лидер прошел три этапа:обнаруживать, синхронизировать, транслировать.
- Обнаружение: требуется, чтобы кластер zookeeper избрал процесс-лидер, а лидер будет вести список доступных клиентов для ведомого. В будущем клиенты смогут связываться с этими узлами-последователями.
- Синхронизация: Лидер отвечает за синхронизацию своих собственных данных с Последователем для обеспечения хранения нескольких копий. Это также обеспечивает высокую доступность и отказоустойчивость разделов в CAP. После того, как фолловер использует необработанные запросы в очереди, он записывает их в локальный журнал транзакций.
- Широковещательная рассылка: Лидер может принять новый запрос Предложения по транзакции от клиента и передать новый запрос Предложения всем Последователям.
9. Расскажите о механизме выборов смотрителя зоопарка
Когда сервер запустится или сервер заработает (лидер зависнет), он войдет в выборы лидера. Давайте посмотрим. Предположим, что сейчас в кластере ZooKeeper пять серверов, и их myid сервер 1, 2, 3, 4, и 5, как показано на рисунке:
9.1 Инициированные сервером выборы лидера
Фаза инициализации кластера Zookeeper, сервер (myid=1-5)по очередиНачало, начало выборов Лидер зоопарка~
- Сервер 1 (myid=1) запущен, в данный момент есть только один сервер и выборы лидера не могут быть завершены
- Сервер 2 (myid=2) запущен, в это время два сервера могут общаться друг с другом и начинают входить в стадию выбора лидера
- 2.1 Каждый сервер выдает один голос
И сервер 1, и сервер 2 голосуют как серверы-лидеры, а базовые элементы голосования включают в себя: myid сервера и ZXID, которые мы представляем в виде (myid, ZXID). На начальном этапе и сервер 1, и сервер 2 будут голосовать за себя, то есть голос сервера 1 равен (1,0), а голос сервера 2 равен (2,0), а затем каждый будет отправлять это голосовать за все остальные машины в кластере.
- 2.2 Принимать голоса с разных серверов
Каждый сервер принимает голоса с других серверов. При этом сервер проверит действительность голосования, является ли это текущим туром голосования, и не от сервера ли оно в состоянии ПРОСМОТР.
- 2.3. Обработка голосов
После получения голосов других серверов, голоса получателей будут совмещены с их собственными голосами.Правила PK следующие:
- Сначала проверьте ZXID. Сервер с большим ZXID имеет преимущество в качестве ведущего.
- Если ZXID одинаковый, сравнивается myid, и в качестве лидера используется сервер с большим myid.
Голос сервера 1 равен (1,0), полученный им голос равен (2,0), а оба zxid равны 0, потому что полученный myid=2 больше, чем его собственный myid=1, поэтому он обновляет свой голос (2,0), а затем повторно отправить голосование. Что касается сервера 2, то есть уже не нужно обновлять собственное голосование, достаточно отправить последнюю информацию о голосовании.
- 2.4 Подсчет голосов
После каждого голосования сервер будет подсчитывать все голоса, чтобы определить, получили ли более половины машин одинаковую информацию о голосовании. Сервер 2 получил два голоса, меньше 3 (n/2+1, n — это общее количество серверов), поэтому продолжайте поддерживать состояние LOOKING.
- Сервер 3 (myid=3) запускается и продолжает входить в стадию выбора лидера
- 3.1 В соответствии с предыдущим процессом, серверы 1 и 2 сначала голосуют за себя, потому что у сервера 3 самый большой myid, поэтому все голосуют за него. В это время сервер имеет 3 голоса (больше или равно n/2+1), поэтому сервер 3 выбирается лидером. Сервер 1, 2 меняет состояние на СЛЕДУЮЩИЙ, сервер 3 меняет состояние на ВЕДУЩИЙ;
- Запускается сервер 4 и инициируются выборы.
- 4.1 В настоящее время серверы 1, 2 и 3 больше не находятся в состоянии ПРОСМОТР, и информация о голосовании не будет изменена. Результат голосования: 3 голоса за сервер 3 и 1 голос за сервер 4. сервер 4 и изменить состояние на СЛЕДУЮЩИЙ;
- Запускается сервер 5 и инициируются выборы.
- Таким же образом сервер также голосует за сервер 3 и сервер 5 и меняет статус на СЛЕДУЮЩИЙ;
- Голосование завершено, сервер 3 выбран лидером
9.2 Выбор лидера во время работы сервера
Работают пять серверов (myid=1-5) кластера zookeeper, и вдруг в какой-то момент зависает сервер-лидер 3, и в это время начинаются выборы лидера~
- изменить состояние
После того, как сервер-лидер зависнет, остальные серверы, не являющиеся наблюдателями, изменят свой статус сервера на ИЩУТ, а затем начнут входить в процесс выбора лидера.
- Каждый сервер инициирует голосование
Каждый сервер голосует сам за себя, и, поскольку он работает, ZXID может быть разным для каждого сервера. Предполагая, что zxids сервисов 1, 2, 4 и 5 равны 333 666 999 888 соответственно, генерируются голоса (1 333), (2 666), (4 999) и (5 888), а затем голоса отправляются на все остальные машины в кластер. .
- Принимать голоса с разных серверов
- Обработка голосов
Правила голосования такие же, как и при запуске кластера Zookeeper, первым проверяется ZXID, а лидером является тот, который больше, поэтому очевидно, что сервер zxid=999 имеет приоритет.
- подсчет голосов
- изменить состояние сервера
10. Алгоритм: по строке s найдите длину самой длинной непрерывной подстроки, не содержащей повторяющихся символов.
Его можно реализовать с помощью скользящего окна, код такой:
public int lengthOfLongestSubstring2(String s) {
int n = s.length();
if (n <= 1) return n;
int maxLen = 1;
//左、右指针
int left = 0, right = 0;
Set<Character> window = new HashSet<>();
while (right < n) {
char rightChar = s.charAt(right);
while (window.contains(rightChar)) {
window.remove(s.charAt(left));
left++;
}
//最大长度对比
maxLen = Math.max(maxLen, right - left + 1);
window.add(rightChar);
right++;
}
return maxLen;
}