Check Levi9 best QA positions to Backbase team!
×Закрыть

Java: пишем SOCKS4/5 proxy server на 10.000 соединений.

Состоялось
16 июня 2012 (суббота)
Время
12:00 — 16:00
Место
харьковский офис компании Ciklum, метро Ботанический Сад, ул. Отакара Яроша 18-Д, ТЦ Движение, 3 этаж
Стоимость
бесплатно

Что рассмотрим:

Пишем «с нуля» несколько вариантов SOCKS4/5 proxy server на блокирующий сокетах (java.net), неблокирующих синхронных (java.nio, Java 1.4.2+), неблокирующих асинхронных (java.nio, Java 7+). Используем паттерны Thread-per-Request, Thread-per-Connection, Reactor, Proactor, Asynchronous Completion Token, Half-Sync/Half-Async. Попутно рассмотрим ряд многопоточных паттернов, выделение памяти за пределами java heap, цену многопоточности (context switch, «остывание» кэша), Staged Event-Driven Architecture (SEDA), Netty framework, взаимодействие NIO и SSL/TLS и много другого.

Цель — разобраться в Java как платформе для сетевых High-Scalable / High-Throughput / Low-Latency серверов.

Почему SOCKS4/5 proxy server? Один из простейших в реализации сетевых протоколов требующих поддержки большого количества одновременно открытых TCP-соединений. Для демонстрации работоспособности легко использовать любой броузер с поддержкой SOCKS-proxy.

Альтернативами могли бы быть — HTTP 1.1 сервер ориентированный на поддержку большого количества Connection: keep-alive соединений (для COMET-ориентированных клиентов), чат-сервер, игровые сервера для MMORPG, сервер для поддержки HTML 5 WebSocket, сервер раздачи потокового аудио/видео. В любом из случаев речь идет о поддержке порядка 10.000 параллельных клиентов.

Об авторе:

Головач Иван — 30 лет, Java Coding Architect, опыт работы как в стартапах так и в компании из Кремниевой Долины, лучший студент Украины в области прикладной математики 2002 года, лучший студент Харьковского Политеха в области прикладной математики все время обучения (1998-2003), Multithreaded/Distributed algorithms specialist, преподавал спецкурсы по многопоточным/распределенным алгоритмам на мех-мате Харьковского Национального Университета, обучал Java junior-ов в EPAM. Область научных интересов: системы типов языков программирования с точки зрения теории категорий, принципиальные соотношение между масштабируемостью хранилища и консистентностью данных. Области интересов также можно проследить по публикациям в блоге KharkovConcurrencyGroup.blogspot.com.

1. Patterns
— Reactor [www.dre.vanderbilt.edu/...t/PDF/reactor-siemens.pdf]
— Proactor [www.cs.wustl.edu/...~schmidt/PDF/proactor.pdf]
— Asynchronous Completion Token (ACT) [www.cs.wustl.edu/~schmidt/PDF/ACT.pdf]
— Half-Sync/Half-Async [www.cs.wustl.edu/~schmidt/PDF/PLoP-95.pdf]
— Patterns for Concurrent and Networked Objects (POSA, Volume 2) [www.amazon.com/...Concurrent/dp/0471606952]
— Patterns for Concurrent, Parallel, and Distributed Systems [www.cs.wustl.edu/...schmidt/patterns-ace.html]

2. Code examples in Java
— Doug Lea Reactor realization [gee.cs.oswego.edu/dl/cpjslides/nio.pdf]
— Reactor vs Proactor [www.artima.com/...s/io_design_patterns.html]
— Orderly Versus Abortive Connection Release in Java [docs.oracle.com/...s/connection_release.html]
— Sun/Oracle site [docs.oracle.com/...ocs/technotes/guides/net]

3. Network/multithreading books / articles
— The C10K problem [www.kegel.com/c10k.html]
— Java Concurrency in Practice [www.amazon.com/...rian-Goetz/dp/0321349601]
— TCP/IP Illustrated, Volume 1: The Protocols [www.amazon.com/...ofessional/dp/0321336313]

4. IO vs NIO discussion
— Thousands of Threads and Blocking I/O [www.mailinator.com/...tymaPaulMultithreaded.pdf]
— Thread per connection : NIO, Linux NPTL and epoll [www.theserverside.com/...hread.tss?thread_id=26700]
— C10k на разных языках/платформах [habrahabr.ru/post/145796]

Регистрациая: +1 в комментариях здесь.

Google Calendar iCal
👍НравитсяПонравилось0
В избранноеВ избранном0
LinkedIn

91 комментарий

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

ИМХО Java не самый (мягко говоря) оптимальный язык для подобных вещей...

Эта лекция — первая лекция курса по «современному» программированию. В курс входит
— java.net.* + java.nio.* (NIO + NIO.2)
— Netty (для сетевой части, как обертка над NIO)
— JGroups (для броадкаста, для образования кластера)
— Zookeeper (для координации нод в кластере)
— Akka (для распределенного обмена сообщениями)
— BerkeleyDB (транзакционное хранилище, но не RDBMS)
— HDFS/HBase/Hadoop (для хранения слабоструктурированной информации)

— распределенные алгоритмы: Paxos agreement, Distributed Hash Table, distributed shared memory, vector/matrix time, CAP-theorem, eventually consistent systems, 2 phase commit, 3 phase commit, global state, synchronizers ... (базовые учебники www.amazon.com/.../dp/0471453242 + www.amazon.com/...dp/0521189845/

Этот курс я буду читать в skilltrek.ru в виде вэбинаров + будем писать реальный проект:
— либо движок для MMORPG (проблема distributed shared memory);

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

В Харькове а «реале» я их просто обкатываю. Пусть это объяснит характер мероприятия в виде лекции. В skilltrek.ru предполагается большой объем самостоятельной работы.

--- ВНИМАНИЕ ---
Тысячу извинений, если ввел кого-нибудь в заблуждение:
1. Реально я рассчитываю, что мероприятие будет длиться до 2х часов (2-3 куска по 30-45 минут).
2.
Лекция носит достаточно вводный характер (если вы пишете 5 лет сетевые сервера — можете разочароваться).
3. Большая часть построена на реализациях HTTP 1.1 сервера, SOCKS4/5 идет в нагрузку. Причина: HTTP 1.1 с Connection:KeepAlive более нагляден.

4. Презентации не будет, я буду рассказывать непосредственно по коду. Причина: презентация менее информативна, чем код.

Ну почему почему не в Киеве, бесплатный субботний семинар. Я увлекаюсь программированием на Java и сейчас делаю именно такой проектик, мне бы безумно помог такой мастер класс. Будет ли видео запись?

Видео пока не планируется.

МЕСТО ПРОВЕДЕНИЯ:

харьковский офис компании Ciklum
метро Ботанический Сад
ул. Отакара Яроша 18-Д

тц Движение, 3 этаж

Был там на мастер-классе по JavaScript.

Ох будем сидеть на головах друг у друга :) Но надо лично проверить свою версию

Думаю стоило сделать какую-нибудь регистрацию для оценки количества участников.

да, EPAM Java-Club просто на гугл доксе форму держат.

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

Где, где, где же это будет происходить? ))))

Пора огласить место проведения.

Хотим прийти, где будет происходить ?

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

будем

Буду, и всем рекомендую!

Не получится прийти. Будет ли возможнсть посмотреть в записи?

Постой, HTTP - это stateless (без поддержки соединения) протокол, работающий по принципу Request-Response. Что тогда значит 10К ОДНОВРЕМЕННЫХ клиентов? Имеет смысл говорить только о N запросах в секунду каждый длительностью M секунд. Но в таком случае ОДНОВРЕМЕННО НА СЕРВЕРЕ будет только N * M запросов. Для N=1000 и M=0.001...0.1сек мы емеем всего лишь 10-100 одновременно обрабатывающихся запросов и, соответственно, 10-100 открытых сокетов. Т.е. оптимизируя(уменьшая) время обработки запроса (M) мы уменьшаем количество одновременно открытых сокетов.

1. В HTTP 1.1 появилась возможность создавать Persistent connections (HTTP keep-alive, HTTP connection reuse) [en.wikipedia.org/…tent_connection]. При этом, с точки зрения HTTP, ситуация все еще stateless, на уровне TCP - соединение держат 5-30 секунд. В таком случае M становится равным 5-30. И мы имеем 5.000-30.000 TCP соединений на сервер. Естественно, каждую секунду запросы должны быть от новых клиентов.

2. Вне зависимости от версии HTTP (1.0/1.1) при использовании COMET-ориентированных клиентов(Ajax Push, Reverse Ajax, ...) [en.wikipedia.org/…t_(programming] (чаты, игры, ...) количество открытых соединений равно количеству подключенных клиентов (для COMET имеет смыст говорить о постоянных подключениях).

3. В HTML 5 появилась новая функциональность - WebSockets [en.wikipedia.org/wiki/WebSocket]. Это немного модифицированный HTTP протокол, позволяющий открывать постоянные соединения с сервером.

4. Потоковое аудио/видео (youtube, vkontakte, ...) реализуется поверх HTTP и требует постоянного соединения с сервером.

Привет, мы у тебя на лабах писали HTTP proxy и подключали его в броузере. В чем же тогда отличие между SOCKS proxy и HTTP proxy если броузер может работать через оба (или только один из них)?

На жаль не вийде прийти.

Цікаво чи буде відео запис або якісь інші матеріали по завершенні події.

Сходить не получиться (я из другого города). Хотелось бы узнать, будет ли текстовая версия? С удовольствием бы почитал про протокол SOCKS.

Желаю посетить.

Если вот это: Стоимость: бесплатно не приведет к тому что будут сидеть на головах друг у друга.

Думаю провести доклад на площадке предоставляемой какой-нибудь крупной местной конторой: EPAM, GlobalLogic, DataArt, Ciclum. Кто захочет принять. Скажем, EPAM Systems - у них есть целый облачный отдел. Или, что бы совсем в шутку, в родном политехе - там как раз конференция MicroCAD 2012. Аудитория 109 - принимает человек 200:)

А разве в Java не два типа TCP/IP sockets? Обычные(блокирующие) и "новые"(неблокирующие)? И разве быть неблокирующим и быть асинхронным - это не одно и то же?

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

Блокирующий - всегда синхронный, вы вызвали - вы заблокировались.
int data = new ServerSocket(80).accept().getInputStream().read();

две потенциальные блокировки (на вызовах каких методов?).

Неблокирующий синхронный - вы открыли ServerSocketChannel, вы открыли SocketChannel, зарегистрировали их в Selector, далее вы СИНХРОННО вызвали Selector.selectNow() и получили множество каналов уже готовых к операциям ввода/вывода (accept, connect, read, write), СИНХРОННО же прошлись по этому множеству, вызвав хандлеры, соответствующие каналам. Вы - Reactor. Обработчики зачустую это различные реализации конечных автоматов (паттерн Asynchronous Comlpetion Token) лежит в виде аттрибута SelectionKey. SelectionKey - аттрибут отношения между конкретным Selector и конкретным Channel.

Неблокирующий асинхронный - вы регистрируете ряд обработчиков в некой системе (собственно в Proactor-е), обработчики АСИНХРОННО вызываются по мере изменения состояния системы ввода/вывода.

Граница между синхронным и асинхронным миром описывается паттером Half-Sync/Half-Async.

В синхронном мире ACT (состояние работы) можно хранить в стеке вызывающего потока. Так как между сокетами и потоками устанавливается отношение 1:1, то такие ценные ресурсы начинают тратится параллельно. Но 10К сокетов — Ок, 10К потоков — не Ок.

Ну все на курс уже можно не идти :)

И меня запишите пожалуйста ;)

Можно и мне поприсутствовать? :)

Да, конечно, мероприятие открытое.

Постараюсь прийти

очень интересно, но приехать нет возможности. Сделайте, пожалуйста, запись мероприятия

Похоже, это будет интересное мероприятие. Надо будет сходить. :)

Поддерживаю, сделайте пожалуйста запись

Я бы тоже послушал.

Уж если кто и является экспертом в многопоточности - так это Ваня. Точно стоит сходить

Интересно. Надо сходить обязательно.

Поддерживаю предыдущих комментаторов, Ваня отлично объясняет! Обязательно прийду

Иван - толковый специалист, стоит сходить.

Конечно пойду))))) Ваня очень интересно и доходчиво объясняет материал!

Круто! Обязательно пришел бы, если бы был в Харькове

Будет интересно, надо сходить

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

обязательно пойду! Училась у Вани в ЕПАМе, не только технически хорошо подкован, но и очень интересно и доходчиво объясняет!

Great! Очень интересно!
Обязательно прийду, концентрированный опыт за 4 часа!

Был на лекциях которые докладчик проводил в Каразина, очень насыщено и интересно!

Постараюсь прийти. Точно будет не бесполезно.

Обязательно буду! Отличный подход и стиль изложения материала. Респект!

4 часа мало. Ваню можно сутками слушать)) Интересно рассказывает.

хм, интересно. Стоит прийти послушать

Обязательно прийду и рекомендую всем знакомым!

Прийду! Иван всегда очень технически подкован

Был бы в Харькове - с удовольствием пришел бы послушать.

О! обязательно прийду послушать Ивана!

О, Иван отлично излагает, рекомендую!

Подписаться на комментарии