какие? Запуск службы Dubbo занимает два часа!

Java Dubbo
какие? Запуск службы Dubbo занимает два часа!

предисловие

Несколько дней назад в тестовой среде я столкнулся с очень странным иdubboПо связанным вопросам я искал в Интернете и впоследствии не нашел похожих сообщений или статей, поэтому у меня есть эта статья.

Надеюсь, будет полезно друзьям, которые не сталкивались или сталкиваются.

Феномен

Феномен такой, однажды тест передислоцируется в тестовую средуdubboОткройте для себя приложения во время подачи заявки“启动不起来”.

Но через несколько часов он может медленно восстанавливаться самостоятельно, и может оказывать внешнееdubboСлужить.

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

И это так медленно, что стоит2 个小时.

Одним из результатов является то, что тест полностью боится выпускать проверку в тестовой среде, и каждая функция проверяется, чтобы исправить одну.bugПридется ждать два часа, кто выдержит.

И после многих наблюдений он занимает около двух часов для приложения для запуска каждый раз.

попробуй решить

Последнее испытание не выдержит, я могу позволить себе только это.“事故报告撰写专家”приди и посмотри.

Это не имело особого значения, когда я узнал о феномене проблемы:

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

Так что я вернул дело к проверке и попросил его сначала найти операцию и техническое обслуживание и не трогать меня, если в этом нет крайней необходимости.Touch fish🐳.

Рано утром следующего дня, чтобы увидеть, как студенты проверят микробланки, я был готов принять“膜拜大佬👍”На ответ получил "В сети все нормально, ее никто не трогал, а если не разрешится, то чиркнет 🤬".

Ну, это невозможно обмануть.

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

Я перезапускаю приложение и используюjstack pidРаспечатайте снимок потока на терминал и потяните его прямо до конца, чтобы увидетьmainЧто делает нить?

Первые несколько снимков были нормальными:

нагрузкаSpring----> подключитьZookeeper---> подключитьRedis, выполняются последовательно без блокировки.

Через какое-то время заявка не подошла, я сноваjstackПосле получения следующей информации:

Перевернуть исходный код

Я ждал десять минут и еще много разjstackИнформация, полученная из снимка, одинакова.

Как показано на рисунке, видно, что основная нить застряла в определенном методе даббо.ServiceConfig.javaв строке 303.

Итак, я нашел исходный код здесь:

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

Идя дальше вниз, он застрял, как в стекеInet4AddressImpl.getLocalHostNameместо.

но этоnativeметод, наше приложение вообще не может вмешиваться, и последнее явление заключается в том, что вызов этого локального метода занимает очень много времени.

Так что эта проблема здесь как бы заблокирована, и делать особо нечего.

окончательное решение

Поскольку это нативный метод, к самому приложению он не имеет никакого отношения (правда, эта проблема возникла внезапно).

Это проблема с самим сервером?nativeМетод заключается в том, чтобы получить роднойhostname, это соответствует этомуhostnameЭто имеет значение.

Это проверено на моем собственном сервере Alibaba Cloud, реальная тестовая среда не имеет такого названия.

получить серверhostnameпопробуй сноваpingэтоhostname, происходит что-то странное:

Команда застрянет на некоторое время (около десятков секунд) в начале, а затем выведетhostnameсоответствующийipи соответствующую задержку.

и когда я прямоpingэтоipКогда вывод последнего смогла быстро реагировать.

Наконец, я попытался добавить соответствующую конфигурацию хоста в файл конфигурации /etc/hosts:

xx.xx.xx.xx(ip) hostname

сноваping hostnameЭффект такой же прямой, какping ipто же.

Поэтому я снова перезапустил приложение, и все было в порядке.

Суммировать

Наконец, попробуйте проанализировать причину этой проблемы в соответствии с измененным содержимым:

  • когдаDubboПри запуске получаю локальный ip, именно через серверhostnameотdnsСервер возвращает текущий IP-адрес.
  • так какdnsСуществует сетевая проблема между сервером или локальным сервером и DNS-сервером, из-за чего этот процесс занимает больше времени (предположение).
  • Я локальноhostПосле конфигурации в файле это эквивалентно наличию локального кеша, причем сначала берется локально настроенный ip, избегая процесса взаимодействия с dns сервером, поэтому скорость улучшается.

Несмотря на то, что проблема решена, остается несколько вопросов:

Во-первых, почему иDNSВзаимодействие с сервером будет настолько медленным, даже если и медленным, то не 2 часа на возврат как приложение.Я тут не очень четко разобрался.Друзья с соответствующим опытом могут оставить сообщение для обсуждения.

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

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

Ваши лайки и репост - лучшая поддержка для меня