Нужен совет опытных по поводу производительности Java I/O и много другого. Задачка такая - в нескольких потоках клиент шлет http post запрос весом до 1 мб каждый, в ответ приходят еще больший по весу (2-4 мб) ответ в формате JSON, который нужно спарсить и аккуратно завернуть в .csv файл. Количество запросов может доходить до десятков тысяч,все ответы сервера пишутся в 1 файл. Сервер один и тот же. (что делать с Keep-Alive ? ) . Соответственно возникает вопрос - а какие инструменты при этом использовать ? Соединение: HttpClient / HttpUrlConnection /Netty/etc Чтение ответа : BufferedReader/Scanner/etc Чем Json парсить ? jackson/gson/simple json Чем писать в файл, и нужно ли вообще писать во время работы или же лучше кидать в какой нибудь ArrayList, потом спарсить и записать. В общем, буду рад любым советам и подсказкам) Вопрос не мой, просто помогаю человеку :)
Ответ
1.) Для объемных файлов конкретный api особо не влияет на скорость передачи, все упрется в возможности железа. Заморачиваться с nio стоит, если есть например много легких соединений, и есть проблемы с переключениями контекстов. Так что выбирайте удобный, отлаженный api. Я бы взял apache http client 4. 2) BufferedReader - хорошее решение 3) Я бы взял jackson - мощный и быстрый. Gson скорее более специализированное решение для конвертации между бинами и json. 4) Писать лучше во время работы из другого потока, будет pipelinig. И запись конечно должна быть буферизованной, например через BufferedWriter. Keep alive лучше выключить. Файлы большие, время установки соединений ничтожно меньше времени передачи. Только морока будет с настройкой сервера. Еще советую на клиенте и сервере установить размеры tcp буфферов в один мегабайт, алгоритм нигла оставить включенным, scaling tcp окна тоже оставить включенным. И еще общий совет: делай каждую стадию отдельной группой потоков, потоки соединяй очередями. Это называется SEDA. Так ты сможешь получить максимальную пропускную способность. Кстати, увеличение длин очередей увеличивается пропускную способность, но ухудшает latency. Имей в виду. Автор ответа - Денис Боровиков, [http://vk.com/id36765][1]
Комментариев нет:
Отправить комментарий