Миллионы котировок в секунду на чистой Java

Роман Елизаров — Миллионы котировок в секунду на чистой Java
Встреча JUG.ru 28.02.2013.

Написание программного обеспечения, работающего под большими нагрузками и обрабатывающего большие объемы данных, — это искусство, требующее настоящего умения, независимо от выбранного для реализации языка программирования. Большая часть техник и подходов, используемых в современном HighLoad, следует из здравого смысла и глубокого понимания архитектуры современных серверов.

Платформа Java имеет массу особенностей, которые, с одной стороны, делают её идеальным выбором для создания больших и сложных систем, но, с другой стороны, заставляют искать специфические подходы и шаблоны для написания высокопроизводительного кода. Этот доклад будет посвящён выделению объектов и сборке мусора, структурам данных и особенностям объектной модели Java, преимуществам и недостаткам компиляции машинного кода «на лету» — в общем, всему тому, чего нет в языках низках уровня типа C и C++ и что необходимо понимать и учитывать при реализации высоконагруженных систем на Java.

Доклад будет сделан на основе опыта, который был накоплен при создании и поддержки компанией Devexperts сервиса доставки рыночных данных в режиме реального времени под торговой маркой dxFeed. Помимо прочего, dxFeed является поставщиком данных от OPRA , обработка потоков данных которой потребует пропускную способность более 12М сообщений в секунду, при входящем потоке данных более 3Gbps уже к июлю этого года.

В тоже время, сервис dxFeed ориентирован на крупные финансовые компании, большая часть инфраструктуры которых обычно написана на языке Java. Поставщик данных, который на 100% использует технологии Java на всем пути их получения, нормализации, обработки, и доставки конечным клиентам, является наиболее подходящим для таких компаний в технологическом плане, при условии что выполняются все функциональные и нефункциональные требования.

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

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