|
|
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Прослушал тут доклад человека с Одноклассников про высоконагруженный сервер, который они писали на Джаве для своих нужд. Возникли вопросы, хочу спросить здесь. 1. а зачем собственно писать свой Джава сервер? почему не взять Tomcat или Jboss, там наверняка все оптимизировано по самое не хочу. 2. известно, что есть 2 способа обрабатывать приходящие на сервер запросы. 1) через сокеты: мы устанавливаем одно TCP соединение с каждым клиентом и выделяем на каждое соединение по потоку. поток считывает и отправляет данные с клиента ( вопрос 2.1: можно ли одновременно читать и писать в один сокет 2мя потоками?) 2) через NIO: у нас есть селектор, который выбирает соединение только тогда, когда оно готово что-то делать, получается что обработка все равно однопоточная, но нет простоя потока когда один из клиентов молчит. вопрос 2.2: может ли NIO работать в несколько потоков? 3. как вся эта кухня соотносится с наличием proxy? допустим перед нашим Джава сервером стоит nginx. он имеет tcp соединения с backend-сервером и по нему передает запросы от пользователей. получается что при джава-сервере на сокетах у нас будет всегда один сокет и один поток. памяти хватит, проблема только в быстродействии. проблемы с простоем нет. так делают? чем такой вариант хуже NIO? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2014, 02:21 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Dymytry , 1) Отнюдь, ни о какой запредельной оптимизации во всяких Tomcat, и уж тем более JBoss, речи не идет совсем. Это обычные приложения для пользования ширнармассами. Если нужно выжимать максимум - всегда пишут свое. Кому-то нужна очень хитрая сериализация, кому-то нужна запись вне хипа, кому-то нужна хитрая логика обработчика (напр. Disruptor), и т.д.. Тем более, что написание своего сервера под конкретную специализированную задачу - это не такое уж сложное занятие. Трудоемкость создания своего сервера на порядки ниже трудоемкости создания Tomcat/JBoss. 2) Суть NIO - один (или несколько, но немного) поток слушает события с сокета. При получении события - он отдает это событие в другой поток для обработки, а сам тут же начинает слушать следующие события. Поэтому NIO многопоточен по умолчанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2014, 08:27 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Dymytry1. а зачем собственно писать свой Джава сервер? почему не взять Tomcat или Jboss "Сервер" это на столько широкое понятие, что им можно назвать всё что имеет серверный TCP сокет. Почему вы решили что сервер одноклассников это какая-то альтернатива "Tomcat или Jboss" я не знаю. В презентации 2011го года они заявляли что используют и Tomcat и JBoss. Dymytry там наверняка все оптимизировано по самое не хочу. Нет не всё. Эти сервера реализуют JEE спецификацию. Если вам нужна какая-то альтернативная архитектура, которая на JEE ложится слабо, то почему бы и не отказать от JEE контейнера? Как минимум в вопросах кластиризации ни Tomcat, ни JBoss никогда не славились. Умеют - да. Но достаточно ли хорошо - вопрос открытый. Dymytry2. известно, что есть 2 способа обрабатывать приходящие на сервер запросы. 1) через сокеты: 2) через NIO: Терминология хромает. NIO тоже работает через "сокеты". Это просто два разных Java API. А термин "сокеты" он немного из другой плоскости. Dymytryмы устанавливаем одно TCP соединение с каждым клиентом и выделяем на каждое соединение по потоку. поток считывает и отправляет данные с клиента ( вопрос 2.1: можно ли одновременно читать и писать в один сокет 2мя потоками?) Можно одновременно читать одним потоком и писать другим если траспортный протокол позволяет. Если имеется ввиду чтение двумя и более и запись двумя и более потоками, то эти чтение\запись нужно синхронизировать. Иначе протокол обменна данными невозможно контролировать. Dymytryу нас есть селектор, который выбирает соединение только тогда, когда оно готово что-то делать, получается что обработка все равно однопоточная, но нет простоя потока когда один из клиентов молчит. вопрос 2.2: может ли NIO работать в несколько потоков? NIO даёт больше возможности выбрать любую архитукуру обработки. Не понятно что именно вкладывается в понятие "обработка". Она, ведь, асинхронная. Может быть сколько угодно потоков. В общем я вопрос не очень понял. А то что селекторы разгребаются в однин поток. Так этого потока достаточно для огромного числа клиентов. Он ведь больше ничего не делает, кромер как получает соединение и запускает обработку для него другими потоками. Dymytry3. как вся эта кухня соотносится с наличием proxy? допустим перед нашим Джава сервером стоит nginx. он имеет tcp соединения с backend-сервером и по нему передает запросы от пользователей. получается что при джава-сервере на сокетах у нас будет всегда один сокет и один поток. памяти хватит, проблема только в быстродействии. проблемы с простоем нет. так делают? чем такой вариант хуже NIO? Это не proxy, а reverse proxy. Да, так делают. Но скорее из иных соображений. Шире возможности отбиться от DDoS. Быстрее отдавать статический контент сайтов. В нормальных highload системах решение никогда не ограничивается одной лишь Java. Highload сервер подразумевает некоторую целостность всего гетерогенного окружения. И специфичиное железо, и не-Java решения для специфичных задач. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2014, 09:20 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Dymytryможет ли NIO работать в несколько потоков? Может. Например, в jetty даже селекторы разгребаются в 2 потока. Если пишешь свой сервер - там есть некоторый гемор по записи в nio-сокет, а именно с определением оптимального момента, когда лучше всего писать следующую порцию данных. Но это проблема не жабовская, а архитектурная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2014, 18:06 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Для многопоточный асинхронной неблокирующей обработки (а вам то и надо, судя по всему) обычно используются классы с NIO.2 Например: http://docs.oracle.com/javase/7/docs/api/java/nio/channels/AsynchronousServerSocketChannel.html Так же рекомендую почитать про proactor pattern. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2014, 21:25 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
DoSOfRedRiverДля многопоточный асинхронной неблокирующей обработки (а вам то и надо, судя по всему) обычно используются классы с NIO.2 Да, ну с фига ли именно NIO.2? Можно подумать NIO весь из себя блокирующий и синхронный? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2014, 22:21 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Dymytry, >>1. а зачем собственно писать свой Джава сервер? почему не взять Tomcat или Jboss, там наверняка все оптимизировано по самое не хочу. Потому что надо заглянуть в исходники и посмотреть сколько там кода, который ничего не делает или изобретает велосипед (тред пулы в томкате, свои байт буфферы с тред пуллами в джетти и т.д.). Проекты страдают от легаси, а выигрыш в перформансе они могут получить скорее всего только коренным образом пересмотрев архитектуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2014, 19:26 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
schwaПотому что надо заглянуть в исходники и посмотреть сколько там кода, который ничего не делает или изобретает велосипед (тред пулы в томкате, свои байт буфферы с тред пуллами в джетти и т.д.).А что не так с тредпулами и байт бафферами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2014, 19:27 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
cdtyjvschwaПотому что надо заглянуть в исходники и посмотреть сколько там кода, который ничего не делает или изобретает велосипед (тред пулы в томкате, свои байт буфферы с тред пуллами в джетти и т.д.).А что не так с тредпулами и байт бафферами? Велосипед на велосипеде и велосипедом погоняет. Были бы эти велосипеды еще новыми.. У меня такое ощущение, что они там про j.u.c. узнали позже меня, а у меня опыта программирования лет на 10 меньше чем там у них. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2014, 19:39 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Конечно они сейчас на j.u.c. уже переползли небось, но это надо было сделать на 5 лет раньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2014, 19:44 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Dymytry, всё усложняется когда узнаёшь профиль нагрузки. Сколько физических серваков? Сколько сессий? Кластер? Шардинг? Какие-то серваки кластеризуются. Какие-то нет. Чем можно жертвовать в аварии? Ну и поддержка прОтоколов мать их так... Конешно если у тебя виртуалка и приложение класса "сферический хомяк в вакууме" то тебе всё равно какой сервер брать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2014, 20:42 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Высоконагруженный сервер писать надо не на джава точно (посмотрите spoj, там java жрет 200мб против 5мб Си/Си++ и по скорости 2,5сек vs 0,2сек). Джава это уютненький энтерпрайз. Пример с одноклассниками - они, наверное раз 100 пожалели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2014, 23:52 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
no56892Высоконагруженный сервер писать надо не на джава точно (посмотрите spoj, там java жрет 200мб против 5мб Си/Си++ и по скорости 2,5сек vs 0,2сек). Джава это уютненький энтерпрайз. Пример с одноклассниками - они, наверное раз 100 пожалели. Прежде чем бредить в прямом эфире, неплохо бы изучить вопрос. И лучше с разных сторон. А то смешно читать) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 01:11 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Благодарю за интересное обсуждение! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 05:28 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, BlazkowiczДа, ну с фига ли именно NIO.2? Можно подумать NIO весь из себя блокирующий и синхронный? Да оно удобней просто, на мой взгляд. Меньше мук с селекторами и прочим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 10:31 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Ищущий Знанияno56892Высоконагруженный сервер писать надо не на джава точно (посмотрите spoj, там java жрет 200мб против 5мб Си/Си++ и по скорости 2,5сек vs 0,2сек). Джава это уютненький энтерпрайз. Пример с одноклассниками - они, наверное раз 100 пожалели. Прежде чем бредить в прямом эфире, неплохо бы изучить вопрос. И лучше с разных сторон. А то смешно читать) Пруф? Вот задача отсортировать банковские счета: java , а вот С/C++ . Ну вам пальчик покажи - рассмеетесь, наверное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 14:25 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Сталкивался с проблемой low latency в сети, беглое изучение доков показало "что не все так однозначно" ( C ) дочь офицера. Например, для высокопроизводительных сетей критичных к low latency явно нужно настраивать афинити на процессы/потоки - Java из коробки такой функциональности не предоставляет. Народ в И-нет уверяет, быстрее 40-50 ms выжимать из Java не удавалось. Хотя HP Low Latency Labs в своих тестах (на С) умудряется и 1.7-3 ms задержки показывать ))). Но для какого нибудь Web-сервера, понятное дело, 5 или 150 ms задержки совершенно не критично. Но это взгляд делитанта. Субж не писал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 14:57 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
no56892, Ха-ха, не показатель, ведь там время работы программы замеряется, а не время работы алгоритма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 15:00 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
no56892Пруф? Вот задача отсортировать банковские счета: java , а вот С/C++ . Ну вам пальчик покажи - рассмеетесь, наверное. Перестаньте позориться. Тема про серверное приложение. Ваш "пруф" - единоразовая задача. Ничего не сказано о настройках Java, которая по-умолчанию отжирает 100Мб под кучу и ещё пару десятков под JVM. Сама задача, при этом, может отъедать столько же памяти, а разница в 100Мб на масштабе сервера в отличие от масштабов сортировки не значительна. Не вижу ничего про "разгорев" JIT, который на 2х секундную задачу, влияет очень сильно. А вот на масштабе 24x7 сервере нивелируется абсолютно. Ну, и пример SBANK вообще показательный на первой двадцате. 3 секунды Java супротив 2 секунд CPP. Вероятно, если предварительно разогреть и оптимизировать настройки под задачу, то можно выйти на те же 2 секунды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 15:03 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
#пошел учить матчасть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 16:08 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
no56892Пруф? Вот задача отсортировать банковские счета: Такой задачи не существует. Это синтетика которую придумывают любители бенчмарков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 16:17 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
maytonno56892Пруф? Вот задача отсортировать банковские счета: Такой задачи не существует. Это синтетика которую придумывают любители бенчмарков. А потом тему читает Шипилев, каментит и все такие сравниватели дружно садятся в лужу) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 19:16 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Ищущий ЗнанияА потом тему читает Шипилев, каментит и все такие сравниватели дружно садятся в лужу) Так то на хабре. Здесь можно не переживать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 21:35 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Ищущий Знанияmaytonпропущено... Такой задачи не существует. Это синтетика которую придумывают любители бенчмарков. А потом тему читает Шипилев, каментит и все такие сравниватели дружно садятся в лужу) Алексей сравнивает работу разогретой машины. А тут берутся критерии, крайне невыгодные для систев динамической компиляции. Если б взяли сервер, который по запросу обрабатывает таски, и замеряли бы внемя выполнения 1000й таски - то время отклика бы было бы сравнимым. А считать потребление памяти jvm, которая стремиться держать максимальный обьем памяти с "ручными" с/с++ вообще смешно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 21:44 |
|
||
|
Написание высоконагруженного сервера на Джаве.
|
|||
|---|---|---|---|
|
#18+
Ищущий Знанияmaytonпропущено... Такой задачи не существует. Это синтетика которую придумывают любители бенчмарков. А потом тему читает Шипилев, каментит и все такие сравниватели дружно садятся в лужу) Кто этот замечательный господин? И почему его нет в этом топике? Наверное ему с нами неинтересно или нам с ним. Поэтому не будем обсуждать ибо не по джентльменски как-то да и икается ему сейчас не кисло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2014, 12:54 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38660832&tid=2127091]: |
0ms |
get settings: |
6ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
178ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
82ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 539ms |

| 0 / 0 |
