Генеральный директор компании сказал мне: «При оптимизации системы не используйте многопоточность легко».

Java задняя часть

Я слышал, что поиск в WeChat для «Java Fish Aberdeen» станет сильнее!

Эта статья включена вgithubа такжеgitee, который содержит мою полную серию статей по Java, вы можете прочитать его для изучения или интервью.

(Введение

В последнее время запущено много приложений во всей компании.После запуска постепенно выявляются некоторые проблемы.Помимо багов очень достойный внимания момент - оптимизация системы. Ведь оптимизация системы может не только сделать программу более стабильной, но и сэкономить некоторую трату ресурсов. В компании с очень хорошей технической атмосферой многие люди рассылают свои собственные планы оптимизации для обсуждения со всеми, но я не ожидал, что это обсуждение взорвет генерального директора компании и нескольких крупных шишек P8 и P9.

В этой статье будут представлены общие методы оптимизации системы, а также некоторые недоразумения, связанные с оптимизацией.

(2) Оптимизация программы

2.1 Медленный SQL

После запуска приложения мы можем отслеживать медленный SQL с помощью различных облачных продуктов.На примере продуктов Alibaba Cloud мы можем подсчитывать медленный SQL за определенный период времени, применяя службу мониторинга в реальном времени ARMS. Самая большая вероятность медленного Sql заключается в том, что Sql прошел полное сканирование таблицы без индексации. Проверка оператора Sql может пройтиexplainКоманда просматривает процесс выполнения, строит индекс, если индекс не установлен, и оптимизирует индекс, если индекс уже есть. Кроме того, обратите внимание на то, чтобы избежать сбоя индекса.Например, следующие шесть пунктов приведут к сбою индекса:

  • 1. Не используйте составные индексы по столбцам или не по порядку (лучший левый префикс): порядок индексов такой же, как порядок запроса оператора SQL.
  • 2. Максимально используйте полное сопоставление индексов для составных индексов.
  • 3. Не производить никаких операций над индексами (вычисления, функции, приведения типов)
  • 4. Например, попробуйте начать с «константы», не начинайте с %, иначе индекс будет недействительным.
  • 5. Старайтесь не использовать преобразование типов (отображаемое, неявное), иначе индекс не будет работать, например:
name的属性是varchar,这里变成了int
select * from teacher where name=123
  • 6. Старайтесь не использовать or, иначе индекс не сработает

2.2 Вызов оператора для запроса внешней службы в цикле

Во время оптимизации системы мы также видели случай вызова и запроса внешних служб или баз данных в циклах for, например:

for (String user:userList) {
    User resultUser = UserMapper.selectByName(user);
    result.add(resultUser);
}

В цикле оператор запроса к базе данных вызывается несколько раз, и необходимо знать, что каждый раз, когда вызывается команда SQL, возникает сетевая нагрузка. В этом случае рекомендуется изменить один запрос на пакетный из одного или нескольких запросов, чтобы сэкономить время сети.

2.3 Интерфейс возвращает только необходимую информацию

Это требование в основном направлено на интерфейсы с большим количеством вызовов.Некоторые интерфейсы будут возвращать большое количество данных, и многие из них не нужны, что приводит к высоким издержкам передачи по сети.

Схема оптимизации также очень проста, корректируйте возвращаемый объект и возвращайте только необходимую информацию.

2.4 Асинхронные потоки должны использовать пулы потоков

Если в коде задействована логика асинхронных потоков, необходимо использовать пул потоков. Есть дело, которое открывает свой поток, и в результате открывается N многопоточность во время запущенного процесса программы, что напрямую крашит приложение.

(3) Оптимизация продукта

3.1 Ограничение времени увеличения запроса

Взяв в качестве примера приложение для работы с большими данными, которое мы сейчас делаем, данные могут в любое время исчисляться сотнями миллионов.В настоящее время ограничение диапазона времени при выполнении хорошего запроса может значительно повысить производительность системы. Например, ElasticSearch, который мы используем для поиска, теперь позволяет пользователям видеть информацию только за последние три месяца каждый раз, когда они входят в тест продукта.

Если пользователи хотят увидеть больше, пусть они сами выбирают временные рамки. Согласно обычному использованию, на каждую сотню запросов может быть только одно определяемое пользователем действие диапазона времени запроса, что значительно повышает эффективность.

3.2 Не позволяйте пользователям выполнять глубокий пейджинг

В настоящее время существует два основных типа внешнего пейджинга.Первый заключается в отображении первой и последней страниц для пользователя, например:

Этот вид пейджинга подходит только для приложений с небольшим объемом данных.Другой метод пейджинга — отображать только страницы до и после текущей страницы, не давая пользователям возможности сразу перейти к последней странице, например пейджинг Baidu:

Нам нужно знать, что независимо от того, какое разбиение базы данных, чем глубже количество страниц, тем ниже эффективность. Старайтесь максимально избегать глубокого разбиения на страницы при тестировании продукта.

3.3 Ограничения на пакетные операции

Многим продуктам нравится разрабатывать некоторые замечательные функции, такие как выбор всех загрузок без установки каких-либо ограничений. Это технически необоснованный дизайн, лучше всего связаться с продуктом и установить верхний предел для пакетных операций.

(4) Непонимание в оптимизации системы

4.1 Используйте многопоточность для повышения эффективности

В сознании большинства людей замена одного потока на многопоточный всегда может повысить эффективность, но обсуждение этого вопроса прямо взорвало генерального директора компании и нескольких крупных шишек P8 и P9. Единодушное мнение этих шишек, проработавших в Али более десяти лет, таково:При оптимизации системы не используйте многопоточность легко, вы думаете, что повысили эффективность, но на самом деле, возможно, вы зарыли много дыр..

Их выводы основаны на многолетнем опыте,Будь то вызов http, встроенный в springboot tomcat или вызов rpc dubbo, все они сами поддерживают пулы потоков.. Поэтому, если время RT делового звонка невыносимо, действительно не рекомендуется запускать многопоточность в сервисном методе.В дополнение к неопределенности обслуживания кода, количество запросов в секунду, которое может поддерживать общий ЦП машины, на самом деле не сильно улучшилось..

А P8 сказал, что раньше работал в отделе, где ему нравилось добавлять в код несколько потоков, в итоге после написания кода он сначала нашел волну людей, которые следили за работой кода, а потом нашел очередная волна людей для оптимизации кода. Отнимающий много времени и неблагодарный.

(5) Резюме

Оптимизация системы — это не технология высокого уровня, а множество базовых знаний. Но он также очень важен для обеспечения стабильности системы и экономии ресурсов. Кроме того, целью оптимизации системы является повышение стабильности работы приложения.Если оптимизация системы приводит к тому, что приложение становится неуверенным, это не стоит потери.

Наконец, я желаю всем своим коллегам счастливого 1024 Дня программиста, я Юзай, увидимся в следующем выпуске.