предисловие
Хорошие братья, в этой статье записаны относительно сложные вопросы для собеседования, которые Ань Цзян брал на собеседовании для публичной компании электронной коммерции в Гуанчжоу. Т.к. Ан Соус действительно не рассматривала эту часть, поэтому ответила грубо (одиноко). Не знаю, из-за паблика ли это, там нет такой проблемы, как высокий параллелизм, но есть вопросы, связанные с многопоточностью. Вопросы интервью следующие, и ответы были добавлены.
02.03.2021 HR другой стороны сообщил результат, что собеседование было пройдено, но выданная зарплата не оправдала моих ожиданий и была отклонена.... Может быть, это начало того, что я становлюсь хулиганом? ?
Как обеспечить последовательное потребление MQ
Так как Ан соус упомянул знакомых в своем резюмеMQ
даRabbitMQ
а такжеRocketMQ
, так что дваMQ
анализировать волну.
Гарантированное последовательное потребление в RabbitMQ
потому чтоRabbitMQ
Сам по себе он не поддерживает последовательное потребление, поэтому, когда очередь имеет несколько потребителей, может возникнуть путаница в потреблении.
решение
Сначала выбирается, когда производитель отправляет сообщениеMQ
Режим отправки точка-точка означает, что очередь соответствует потребителю, а затем все сообщения, которые должны быть гарантированно упорядочены, отправляются в очередь.
Потребители должны закрытьсяAutoack
, и воляprefetchCount
Установите на один, получайте только одно сообщение за раз, выполняйте подтверждение вручную после обработки, а затем получайте следующее сообщение. Поскольку имеется только один потребитель, это обеспечивает последовательное потребление.
Гарантированное последовательное потребление в RocketMQ
потому чтоRocketMQ
Поддерживает последовательное потребление, вот цитата с официального сайта.
Порядок сообщений означает, что сообщения могут потребляться в том порядке, в котором они были отправлены (
FIFO
).RocketMQ
Порядок сообщений может быть строго гарантирован, и его можно разделить на порядок разделов или глобальный порядок. Анализ принципа последовательного потребления.По умолчанию отправка сообщения будет заниматьRound Robin
Метод опроса отправляет сообщения на разныеqueue
(разделенная очередь); при потреблении сообщений из несколькихqueue
Вытягивание сообщений, в этом случае порядок отправки и потребления не гарантируется. Но если последовательные сообщения, отправляемые системой управления, посылаются только последовательно одному и тому жеqueue
, при потреблении только из этогоqueue
Тяните их последовательно, тогда порядок гарантирован. При отправке и использовании участвующихqueue
Есть только один, он глобально упорядочен; если их несколькоqueue
Участие, разбиение упорядочено, т. е. относительно каждогоqueue
, сообщения упорядочены.
Так как же производитель гарантирует, что сообщения могут быть отправлены в очередь по порядку? можно использоватьHash
Алгоритм по модулю, например, тот же заказ отправляется в ту же очередь после прохождения алгоритма, а затем синхронно отправляется, успешно отправляется только сообщение о создании того же заказа, а затем отправляется сообщение об оплате. Таким образом, мы гарантируем упорядоченную доставку.
Слова потребителя в основном для достиженияMessageListenerOrderly
интерфейс и установитьConsumer
Первый запуск - начать потребление с головы или хвоста очереди, если это не первый запуск, то продолжить потребление по позиции последнего потребления (consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET)
).
Кратко расскажите о процессе MySQL, выполняющем оператор SQL.
Это все еще очень сложно, поэтому давайте не будем усложнять. Возьмем в качестве примера оператор запроса, который немного отличается от оператора new, как показано на следующем рисунке.
Соединитель
в запросеSQL
Перед утверждением необходимо сначала установитьMySQL
подключение, которое осуществляется разъемом. Коннектор отвечает за установление соединения с клиентом, получение разрешений, поддержку и управление соединением.
кэш запросов
После установления соединения начинается выполнениеselect
оператор, кеш будет опрошен перед выполнением.
MySQL
После получения запроса запроса он сначала запросит кеш, чтобы увидеть, был ли выполнен этот оператор. Выполненные операторы и их результаты представлены в видеkey-value
Форма пары хранится в определенной области памяти.key
это оператор запроса,value
является результатом запроса. Если ваш запрос можно найти прямо в этом кешеkey
, то этоvalue
будут возвращены непосредственно клиенту.
Если оператора нет в кэше запросов, он перейдет к следующему этапу выполнения. После завершения выполнения результат выполнения будет сохранен в кэше запросов. Если запрос попадает в кеш,MySQL
Вы можете напрямую вернуть результат без выполнения следующих сложных операций, что повысит эффективность.
Анализатор
Если кеш запроса отсутствует, пора начинать выполнение оператора. первый,MySQL
нужноSQL
Предложения разбираются.
Сначала анализатор выполнит лексический анализ.SQL
Операторы состоят из нескольких строк и пробелов,MySQL
Вам нужно определить, что представляют собой строки внутри и что они представляют. MySQL из вашего вводаselect
Идентифицируется это ключевое слово, которое является оператором запроса. Он также принимает строкуuser_info
Распознается как имя таблицы, строкаid
Распознаются как имена столбцов. Затем нам нужно сделать грамматический разбор. По результату лексического анализа синтаксический анализатор будет оценивать ввод в соответствии с правилами грамматики.SQL
Удовлетворено ли заявлениеMySQL
грамматика.
оптимизатор
После лексического разбора и синтаксического анализа анализатора он также обрабатывается оптимизатором.
Оптимизатор решает, какой индекс использовать, когда в таблице есть несколько индексов или когда оператор связан с несколькими таблицами (join
), определите порядок соединения каждой таблицы.
Актуатор
MySQL
Зная, что делать через анализатор, и зная, как это сделать через оптимизатор, он входит в фазу исполнителя и начинает выполнять оператор.
Когда вы начнете выполнять, вы должны сначала оценить свое понимание этой таблицыuser_info
Есть ли разрешение на выполнение запроса, если нет, будет возвращена ошибка отсутствия разрешения. Если у вас есть разрешение, откройте таблицу, чтобы продолжить выполнение. Когда таблица открыта, исполнитель вызовет соответствующий интерфейс чтения соответствующего механизма в соответствии с определением механизма таблицы.
Базовая структура данных Redis String
Redis
используетсяC
язык, но дляRedis
строка, но неC
Строка на языке (т.е. с нулевым символом\0
конечный массив символов).
используетсяSDS
(Простая динамическая строка), формат данных показан ниже.
-
free
записаноbuf
Количество неиспользуемых байтов в массиве. -
len
сохраненSDS
Содержит длину строки. -
buf[]
Массивы используются для хранения каждого элемента строки.
преимущество
использоватьSDS
Преимущества заключаются в следующем:
Постоянная сложность для получения длины строки
потому чтоlen
существование свойства, мы получаемSDS
Длину строки нужно только прочитатьlen
свойства, временная сложностьO(1)
. И дляC
Язык, длина строки обычно достигается путем обхода счетчика, а временная сложность равнаO(n)
. пройти черезstrlen key
команда, чтобы получитьkey
длина строки.
Избегайте переполнения буфера
мы знаем этоC
используемый языкstrcat
для объединения двух строк, если не будет выделено достаточно места в памяти, это вызовет переполнение буфера. И дляSDS
Тип данных, при изменении символов он сначала будет основываться на записанномlen
Атрибут проверяет, соответствует ли объем памяти требованиям, если нет, то будет произведено соответствующее расширение пространства, а затем будет выполнена операция модификации, чтобы не было переполнения буфера.
Уменьшите количество перераспределений памяти, которые изменяют строки
C
Поскольку язык не записывает длину строки, если вы хотите изменить строку, вы должны перераспределить память (сначала освободить, а затем применить), потому что, если нет перераспределения, когда длина строки увеличивается, она будет вызовет переполнение буфера памяти, и длина строки переполнится, а при уменьшении вызовет утечку памяти.
И дляSDS
,так какlen
свойства иfree
наличие атрибута для изменения строкиSDS
Реализованы две стратегии предварительного выделения пространства и отложенного освобождения пространства:
1. Предварительное выделение пространства: при расширении пространства строки расширенная память превышает фактическую потребность, что может уменьшить количество перераспределений памяти, необходимых для операций непрерывного роста строки.
2. Ленивое освобождение места: при сокращении строки программа не сразу использует перераспределение памяти, чтобы вернуть лишние байты после сокращения, а используетfree
Свойство записывает количество этих байтов для последующего использования. (КонечноSDS
также предоставляет соответствующиеAPI
, мы также можем вручную освободить эти неиспользуемые пространства, когда они нам понадобятся. )
бинарный сейф
потому чтоC
Строка помечается нулевым символом в конце строки, а для некоторых двоичных файлов (таких как изображения и т. д.) содержимое может включать пустую строку, поэтомуC
Доступ к строке невозможен, и всеSDS
изAPI
обрабатываются в двоичном форматеbuf
элемент внутри иSDS
Вместо того, чтобы использовать пустую строку, чтобы определить, следует ли заканчивать,len
Длина атрибута для определения того, заканчивается ли строка.
Совместимость с некоторыми строковыми функциями C
несмотря на то чтоSDS
является двоично-безопасным, но по-прежнему следует соглашению о том, что каждая строка завершается нулем, чтобы ее можно было использовать повторно.C
языковая библиотека<string.h>
некоторые функции в .
Кратко опишите характеристики микросервисов
Единая ответственность, независимость команды, независимость от технологий, разделение клиентской и серверной части, разделение базы данных, независимое развертывание, управление услугами
Разница и принцип ${} и #{} в mybatis
#{}
является заполнителем параметра, маркером параметра в подготовленном операторе JDBC.
${}
Просто замена строки, замена переменных будет выполняться на этапе динамического анализа SQL.
Отличие в том, что при настройке параметров#{}
Он заменяет параметры в виде строк (с двойными кавычками). а также${}
Просто замените значение параметра на переменную, тогда оно появитсяSql
проблема с впрыском.