Краткое изложение руководства по разработке Ali Java
Отличие отличного инженера от обычного инженера не в архитектурных диаграммах, разлетающихся по всему небу, а в том, что его навыки отражаются в каждой строчке кода, который он пишет. -- Би Суан
Именованный стиль
[Резюме книги] Используйте стиль UpperCamelCase для имен классов, таких как DO/BO/VO/PO
[Резюме книги] Метод в нижнем верблюжьем стиле, попробуйте быть глаголами
Небольшие мысли: например, часто используемый
- Получить один объект, getUserById
- Получить объект не надоело, listUserByGroupId
- Подсчитайте количество объектов, countUserByClassId
- Добавить, удалить, вставить, удалить, обновить и т. д.
2. Постоянное определение
[Резюме книги] Если значение переменной изменяется только в одном диапазоне, используйте тип перечисления
Небольшая мысль: например, статус заказов в электронной коммерции можно перечислить пальцем. Итак, обычно определяйте OrderSatausEnum, чтобы это сделать, псевдокод выглядит следующим образом:
public enum OrderSatausEnum {
TO_PAY(1,"代付款"), PAID(2,"已付款") ...;
private Integer orderStatus;
private String orderSatausDes;
OrderSatausEnum(Integer orderStatus,String orderSatausDes) {
this.orderStatus = orderStatus;
this.orderSatausDes = orderSatausDes;
}
// get set
}
Далее, что, если заказ будет добавлен в статус "В ожидании группы" в один прекрасный день? Таким образом, эти настройки могут быть отправлены в центр настройки. Например, аполлон от Ctrip и т.д.
3. Правила ООП
[Резюме книги] Метод equals объекта склонен генерировать исключения нулевого указателя. Вы должны использовать константы или определять высококачественные объекты для вызова equals .
Например: "TO_PAY".equals(order.getOrderStatus()). Писать наоборот неправильно, потому что order.getOrderStatus() может быть нулевым.
Естественно, больше рекомендуется использовать служебный класс java.util.Objects#equals.
[Резюме книги] Все сравнения значений между объектами-оболочками одного и того же типа используют метод equals.
Небольшое размышление: не используйте ==. Equals также должны обращать внимание на такие вещи, как значение объекта Status типа Byte, при этом equals следует обратить внимание на:
getStatus().equals(0) // 反例,false
getStatus().equals((byte)0) // 正例,true
Кроме того, ==, такое как Integer, обычно находится в диапазоне от -128 до 127, и это ненормально, если оно превышает. Причина в том, что объекты в диапазоне от -128 до 127 генерируются в IntegerCache.cache, который будет повторно использовать объекты. Итак, не забудьте запомнить, не используйте ==, используйте равенство для сравнения.
4. Обработка коллекции
[Резюме книги] Не выполняйте операции удаления/добавления над элементами в цикле for. Пожалуйста, используйте метод Iterator для удаления и заблокируйте объект Iterator, если есть параллельные операции.
Как работать с коллекцией Iterator конкретно, вы можете скачать ее с Baidu. Это по-прежнему типичный шаблон проектирования итераторов.Вы можете углубиться в исходный код, чтобы увидеть простые принципы реализации других, и вы можете получить много дополнительных знаний.
5. Параллельная обработка
[Резюме книги] Во-первых, потоки должны предоставляться через пул потоков, а явное создание потоков не допускается. Во-вторых, пулы потоков нельзя создавать с помощью Executors, и их следует создавать с помощью ThreadPoolExecutor. так как Несколько пулов потоков, созданных Executors, имеют недостатки:
- FixedThreadPool и SingleThreadPool допускают, чтобы длина очереди запросов была Integer.MAX_VALUE , большое количество запросов вызовет OOM
- CachedThreadPool и ScheduledThreadPool позволяют создать максимальное количество потоков, равное Integer.MAX_VALUE, создание большого количества потоков приведет к OOM
Таким образом, цель использования ThreadPoolExecutor — лучше понять правила работы пула потоков, избежать исчерпания ресурсов, лучше соответствовать определенному бизнес-сценарию и создать более подходящий пул потоков.
[Резюме книги] В сценариях с высокой степенью параллелизма синхронные вызовы должны учитывать потерю производительности блокировок. Если вы можете использовать структуры данных без блокировок, не используйте блокировки; если вы можете блокировать блоки, не блокируйте все тело метода; если вы можете использовать блокировки объектов, не используйте блокировки классов. То есть, чем меньше степень детализации блокировки, тем меньше потеря производительности. И метод RPC вызывается в блоке кода, который позволяет избежать блокировки.
Кроме того, при одновременной блокировке нескольких ресурсов необходимо поддерживать согласованную последовательность блокировки. В противном случае последовательность блокировки одного потока — ABC, а последовательность блокировки другого потока — ACB или BAC и т. д., что приведет к взаимоблокировке. Как показано на рисунке:
【Книжный реферат】Информация, связанная с финансовыми фондами, используйте пессимистическую блокировку. Например, обновить поле баланса кошелька пользователя.
Небольшая мысль: когда я использовал P2P, я просто использовал блокировку строк MySQL.
SELECT * FROM xx WHREER xx.id=888 FOR UPDATE
О конкретных блокировках строк и таблиц можно узнать на Baidu.
6. Операторы управления
[Резюме книги] Сценарии с высокой степенью параллелизма, такие как сценарии seckill, вычеты товаров из запасов и оценка запасов, не используют "равно" для определения условия, при котором товарные запасы были распроданы. Вместо этого следует использовать условие больше или меньше.
Быстрая мысль: это классический сценарий перепроданности. Некоторые люди спросят, что будет несколько проблем с перепроданностью, верно? Ответ положительный. Однако, если он оценивается как равный , количество перепроданных штук будет много-много, например 10 000 штук. Но 10 000 перепроданностей и 1 перепроданность — это не один и тот же уровень провала. Или разницу между ошибкой и той, которой нет.
7. Обработка исключений
[Резюме книги] Исключения не должны использоваться для управления процессами, условного управления
Небольшое размышление: вчера JD.com спросил меня, можно ли так понизить это? Следующий код:
try {
searchFromES()
}catch(){
searchFromDB()
}
Это не понижение, и так нельзя делать. Во-первых, код написан неправильно, а исключения не должны использоваться для контроля процессов и условного контроля. Во-вторых, пока есть проблемы с чтением ЭП, БД не может быть прочитана. Рассмотрите возможность реализации шаблона проектирования «Цепочка ответственности». Псевдокод выглядит следующим образом:
ESHandle {
void handle() {
try {
searchFromES()
}catch(){
}
}
}
DBHandle {
void handle() {
try {
searchFromES()
}catch(){
}
}
}
// 两个 Handle 利用责任链去实现即可。
8. Создайте спецификацию таблицы, оператор SQL
[Резюме книги] Когда количество строк в одной таблице превышает 5 миллионов строк или емкость одной таблицы превышает 2 ГБ, рекомендуется использовать подтаблицу подбазы данных.
Если ожидается, что порядок величины за три года не может достичь этого уровня, пожалуйста, не разделяйте базу данных и разделяйте таблицу при создании таблицы.
【Резюме книги】Не используйте count(название столбца) или count(константа) вместо count(*). Потому что это предварительная версия стандартного счетчика строк, определенного в SQL92. Он считает NULL строки.
[Резюме книги] При условии где можно избежать входа. Обратите внимание на количество наборов входа, которое должно контролироваться в пределах 1000.
[Резюме книги] Напишите запрос на подкачку в коде, если count равен 0, верните пустой список напрямую. Избегайте выполнения приведенного ниже оператора разбиения на страницы.
9. Сервер
[Резюме книги] Рекомендуется уменьшить тайм-аут time_wait протокола TCP для серверов с высокой степенью параллелизма. Linux модифицирует файл /etc/sysctl.conf, код выглядит следующим образом:
net.ipv4.tcp_fin_timeout = 30
[Сводка книги] Параметр настройки JVM -XX:+HeapDumpOnOutOfMemoryError. Разрешить JVM выводить информацию о дампе при обнаружении OOM.
Маленькая мысль: это очень важно. Оба должны сохранить сайт аварийного сервера. Например, если сервер OOMed, машина будет поднята в VIP или что-то в этом роде, чтобы у машины больше не было запросов на вход. Затем проверьте информацию дампа, чтобы устранить проблемы с OOM.
Инженеры должны стремиться к совершенству в коде, будь то с точки зрения производительности или простоты и элегантности, они должны обладать духом мастерства и тщательно полировать свои работы. -- Дорон
Эта статья публикуется блогерами и другими операционными платформами.OpenWriteвыпуск