Оригинал: Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки.
В отделе работает новый архитектор с опытом работы в BAT, он живет на третьем транспортном кольце, ездит на работу на BMW и имеет парковочное место.
Парень мало говорит, но стоит ему заговорить решительно, как он обретает непоколебимую уверенность. Причина в том, что с его сотнями миллионов высокопараллельных операций каждая секунда запросов находится за пределами досягаемости других компаний, работающих в течение года. Это очень завидно, ведь он зарабатывает на этом больше, чем я.
Как говорится, если вы хотите быть в безопасности в компании, не пишите код. Слишком много работы чревато несчастными случаями, и это никого не волнует — такова реальность.
Но иногда это зависит от результатов. Новый руководитель R&D не разбирается в технологиях, но разбирается в технических индикаторах, поэтому считает количество git, отправленных каждым.Если активность git зеленая, как акции A, это считается пропуском.
Архитектор подумал об этом и решил получить одинСамый высокий одновременный спрос: подсчитайте среднее время отклика интерфейса и количество запросов с момента его запуска.
Почему говорят, что его параллелизм высок? Это связано с тем, что он учитывает все интерфейсы, что, естественно, больше, чем объем запросов каждого интерфейса. Код АОП представляет собой пакет, и каждый интерфейс должен исходить от него.
Настала очередь нашего архитектора. Код показан на рисунке.
Архитектор сказал, что мой код не нуждается в аннотациях. Так называемые комментарии предназначены для мусорного кода. Я действительно думал, что это было, он явно страдалNetflix
воздействие компании.
Программа учитывает сценарии с высокой степенью параллелизма и использует потокобезопасность.ConcurrentHashMap
, а затем извлекать соответствующие данные, каждый раз отслеживая ключ, а затем увеличивать значение. Для такого простого кода действительно нет необходимости добавлять какие-либо комментарии.
как проектМаксимальное количество параллелизмаКод, находящийся в доверительном управлении старшего архитектора, нам не нужно ни проверять, ни тестировать. Все заняты, кодируй ты, давай погуляем онлайн.
Я предлагаю вам сначала искать проблему в коде, если вы найдете проблему, то она лучше архитектора, если вы ее не найдете, это не доказывает, что вы слабее архитектора, тут нечего делать грустно о.
Вставьте картинку ниже, чтобы заблокировать свое мышление.
В установку B ударила молния, и после работы в сети в течение некоторого времени память переполнилась.
Ведь все спорилиxjjdog
При этом цикл устранения неполадок, связанных с переполнением памяти, очень долгий, и в среднем для решения проблемы требуется около 40 дней. Когда все начали демонстрировать, архитектор тайно началEclipse MAT. MAT очень подходит для анализа проблем с памятью, но только если вам нужно повозиться со стеком.
Архитекторы будут использоватьjmap
, Самое главное, что авторитет большой, поэтому сделал копию для оффлайн анализа.
Я могу понять его настроение, в конце концов, найти проблему в собственном коде не очень приятно. Он обнаружил, что куча памяти заполненаMonitorKey
иMonitorValue
.
Monitor$MonitorKey@15aeb7ab
У меня хорошие отношения с архитектором, поэтому он спросил меня:Наши интерфейсы слишком особенные?
Я говорю:Нет, не смотрите на большое количество посещений, сколько интерфейсов может быть у такого хренового бизнеса? Сотни выдержали.
Он сказал:Я нашел десятки миллионов в куче...
После того, как он закончил говорить, он перестал говорить, потому что обнаружил, что в нем много одинаковых интерфейсов. Это должно быть причиной параметра, поэтому он добавил это в код, поставил?
Последний обрезан.
key = key.split("\\?")[0];
Результаты были размещены в Интернете, и память снова переполнилась. На этот раз это наконец-то привлекло внимание больших коров.После разбора всех выяснилось, что код забыли датьMonitorKey
переписатьequals
иhashCode
метод.
Я не мог не покраснеть. Как хороший друг, я не должен был заставлять его выглядеть так. Но я слегка счастлив, потому что его зарплата выше моей.
Так что это большой вопрос. Многие студенты хорошо ответили на очки знаний HashMap и даже специально заучили красно-черное дерево. А спросить по-другому, а то он растерялся.
Один из вопросов таков: можно ли использовать обычный объект в качестве ключа HashMap?
Ответ, очевидно, да, но вам нужно обратить внимание на переопределение методов hashCode и equals. Если вы забудете переписать, велика вероятность вызвать утечку памяти.
К сожалению, есть много случаев, которые на самом деле забыты. Также будут наняты архитекторы Daniel.
После того, как код переписывает методы hashCode и equals, в строке не возникает переполнения памяти.
Подожди, это еще не конец. В конце концов, это архитектор, и один такой баг не может доказать уровень. Баги, написанные архитекторами, должны быть необычными.
Таких вещей становится все больше и больше, и авторитет руководителей НИОКР в области технологий уже не так холоден. Мы решили начать с кода с наибольшим количеством параллелизма и провести обзор кода.
К сожалению, архитекторvisit
Есть проблема с кодом. Хоть проблема и не велика, но все-таки проблема.
Метод посещения сначала извлекает ключ, затем он пуст, а затем вставляется значение. Очевидно, что это не атомарная операция.
线程1:获取key为a的值
线程2:获取key为a的值
线程1:a为null,生成一个b
线程2:a为null,生成一个c
线程1:保存a=b
线程2:保存a=c
В этот момент B теряется.
Бизнес может это терпеть, но суровые технические гуру не выдерживают, поэтому выдвигают предложения по доработке.
Архитектор сказал, добавьте метод посещения вsynchronized
Нет, не будет.
public synchronized void visit(String url, String desc, long timeCost)
Я говорю нет. Есть более элегантный способ записи, который более эффективен. то есть использоватьputIfAbsent
метод изменения кода следующие:
MonitorKey key = new MonitorKey(url, desc);
MonitorValue value = monitors.putIfAbsent(key, new MonitorValue());
value = monitors.get(key);
value.count.getAndIncrement();
value.totalTime.getAndAdd(timeCost);
value.avgTime = value.totalTime.get() / value.count.get();
Все спорили об этих двух методах.
Технический директор взялся за щеки и долго думал, посмотрел на раскрасневшихся одноклассников и сказал:Вот почему я тебе не доверяю. Онлайн-среда должна быть максимально стабильной с минимальными изменениями. С момента добавленияsynchronized
Это может быть легко и просто решить проблему, почему бы не использовать его напрямую? Следующие изменения кода слишком велики и опасны.
Затем директор повернул голову ко мне:Этот баг очень необычный.Чтобы все узнали об этом, вы сделаете обзор всей аварии. Делитесь информацией об устранении неполадок и извлеченными уроками со всеми, чтобы каждый мог следовать этой простой структуре. В нашей обычной работе мы должны изо всех сил стараться быть ориентированными на результат..
Таково происхождение этой статьи.Меня скромно учат, и в то же время я понимаю, что моя зарплата не может расти.
Если вы дадите лайк или подружитесь, может быть, вы сможете утешить меня.
Об авторе:Мисс сестра вкус(xjjdog), публичная учетная запись, которая не позволяет программистам идти в обход. Сосредоточьтесь на инфраструктуре и Linux. Десять лет архитектуры, десятки миллиардов ежедневного трафика, обсуждение с вами мира высокой параллелизма, дающие вам другой вкус. Мой личный WeChat xjjdog0, добро пожаловать в друзья для дальнейшего общения.