hirthwork 08.07.2012 17:34 mcabber7698B710

я тут пытаюсь понять, как правильный HTTP-сервер должен себя вести. хочется услышать критику к подходам и методам.
рассуждаю в терминах жабы, но все кто осилил http://docs.oracle.com/javase/7/docs/api тоже приглашаются к дискуссии.

- Когда пишешь http-сервер первый раз, то на каждый accept() создаёшь новый
Thread с обработчиком.
Это может привести к неконтролируемому росту потоков

- Когда пишешь http-сервер второй раз, то после каждого accept() кладёшь
Runnable в newFixedThreadPool.
Это может привести к тому что из-за нескольких keep-alive соединений, ты
новые соединения обрабатывать перестанешь

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

- В четвёртый раз, я хочу использовать ThreadPoolExecutor в ArrayBlockingQueue,
с размером очереди в разы большим чем число потоков. В конце каждого run()
вместо цикла будет проверяться — если коннект всё ещё жив, то делается
offer() в очередь в обход ThreadPoolExecutor.submit(). Если не удалось —
закрываем соединение. Ибо нефиг.
Это наверное грешно.

1. DZhon 08.07.2012 19:38

В java же есть I/O с мультиплексированием через java.nio (смотреть в сторону каналов), али это больно низко уровнем ?

2. hirthworkDZhon /1 08.07.2012 19:43 mcabber7698B710

мне кажется это не совсем имеет отношение к тому в каком порядке и во сколько потоков обрабатывать соединения

3. DZhonhirthwork /2 08.07.2012 20:14

Вероятно, да. Но асинхронная манера работы всяко позволит более гибко выбирать дальнейшую судьбу обработки: использовать ли пул, или все отдавать одному воркеру. Event-driven все-таки, как метко высказался Ктулху.

4. hirthworkDZhon /3 08.07.2012 20:17 mcabberA871D04D

event-driven или нет, но количество воркеров (т.е. потоков, которые обработают уже распаршенный GET-запрос) у тебя будет всё равно конкретное количество и соединения у тебя будут физические, с которыми нужно что-то сделать.

5. DZhonhirthwork /4 08.07.2012 20:19

Гм, ладно, это я, видимо, не в ту степь полез.

Кстати, если интересно, как на жавке пишут http сервера, то вроде вот что-то: http://code.google.com/p/rupy/

7. hirthworkDZhon /1 09.07.2012 14:05 mcabber8517D853

в официальной доке по HttpCore пишут: Contrary to the popular belief, the performance of NIO in terms of raw data throughput is significantly lower than that of blocking I/O.

8. DZhonhirthwork /7 09.07.2012 16:30

Там же пишут, что в случае большого числа соединений лучше NIO.
Это уже какая задача.

9. hirthworkDZhon /8 09.07.2012 16:38 mcabber8517D853

там где много асинхронных соединений я использую NIO, а там где гигабайты данных приходят, юзаю обычный HttpCore

Do you really want to delete ?