2009-07-30 3 views
35

Я читал много о финансовых системах с низкой латентностью (особенно, поскольку знаменитый случай корпоративного шпионажа) и идея систем с малой задержкой были в моем сознании с тех пор. Есть миллион приложений, которые могут использовать то, что делают эти ребята, поэтому я хотел бы узнать больше об этой теме. Дело в том, что я не могу найти ничего ценного в этой теме. Кто-нибудь может рекомендовать книги, сайты, примеры на системах с низкой задержкой?Программирование с малой задержкой

+0

Какой знаменитый случай корпоративного шпионажа? –

+3

Программист Goldman Sachs, предположительно, крадущий исходный код для своей высокочастотной торговой платформы: http://ftalphaville.ft.com/blog/2009/07/08/60761/the-cold-war-in-high-frequency-trading/ – mattnewport

+0

Спасибо Мэтту! –

ответ

4

Все, что в реальном времени программирует, соответствовало бы счету. Я подозреваю, что это не совсем то, что вам нужно, но это очень хорошее место для начала.

+1

Real программирование времени не является латентным, его реакция на события в течение определенного периода времени, не обязательно быстрая. – user997112

1

Если я правильно помню, то в настоящее время Java (RTSJ) используется, хотя я не могу найти хорошую статью для ссылки на данный момент.

+0

Я работаю над RTSJ. К сожалению, больше нет релизов RTSJ. (Oracle остановила выпуск RTSJ и поддержала его). В основном это позволяет избежать остановки на сборке мусора. – BalaB

5

Ну, это не просто «традиционное» программирование в реальном времени, его все. Я работаю на бирже - скорость короля. типичной проблемой является самый быстрый способ записи в файл? самый быстрый способ сериализации объекта? и т. д.

+0

Какой язык вы используете для своего программного обеспечения, C/C++ или что-то еще? –

1

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

42

Я работаю в финансовой компании, которая производит программное обеспечение с низкой задержкой для обмена данными непосредственно с биржами (для отправки сделок и потоковых цен). В настоящее время мы развиваемся в основном на Java. В то время как низкая сторона задержки не является областью, я работаю непосредственно у меня есть четкое представление о необходимых навыков, который будет включать в себя следующее по-моему:

  • Детальное знание модели памяти Java и методы, чтобы избежать ненужная сборка мусора (например, объединение объектов). Некоторые из используемых методов обычно можно рассматривать как «анти-шаблоны» в традиционной OO-среде.
  • Подробные знания многоадресной рассылки TCP/IP и UDP, включая утилиты для отладки и измерения задержки (например, DTrace в Solaris).
  • Опыт применения профилирующих приложений.
  • Знание пакета java.nio, опыта разработки масштабируемых серверных приложений на основе NIO, опытного проектирования проводных протоколов. Также обратите внимание, что мы обычно избегаем использования фреймворков и внешних библиотек (например, Google Protobuf), предпочитая писать много на заказ кода.
  • Знание FIX и коммерческих библиотек FIX (например, Cameron FIX).

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

+7

Низкая латентность и Java? похоже на оксюморон. –

+6

@ ZamfirKerlukson: у нас есть приложение обмена сообщениями Java, которое обрабатывает входящие сообщения через 8-9 микросекунд. Наши более сложные серверные приложения обрабатываются в 65-80 микросекунд. Одна вещь, о которой нужно помнить о Java, - это возможность компилятора JIT выполнять анализ кода и динамически встроенные методы и доступ к данным. Это автоматизирует то, что программисты C делают вручную с ключевым словом «inline». Тем не менее, контроль времени паузы GC - вызов (хотя есть некоторые решения JVM, которые пытаются решить это). –

+0

Низкая латентность в Java ??? Как это возможно ??? Если вы хотите перейти на низкую задержку, вы должны, по крайней мере, переключиться на C/C++ или даже на сборку. Я работаю для шлюза с низкой задержкой обмена, и мы можем получить 10-20 us для одной обработки пакета, включая разбор сообщений, проверку риска, распределение базы данных, FIX для преобразования собственных сообщений на C++. С Java это просто оказывается совершенно неправильным в первый день. –

3

Взгляните на ZeroMQ. http://www.zeromq.org

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

1

Если говорить о низкой конструкции сервера задержки, вот некоторые хорошие указатели: http://www.kegel.com/c10k.html http://pl.atyp.us/content/tech/servers.html

19

Низкая задержка является функцией многие из которых являются двумя наиболее важными из них:

  • Сетевая латентность - то есть время, затрачиваемое на передачу и прием сообщений в сети.
  • латентность обработки - то есть время, которое ваша заявка выполняет в отношении сообщения/события.

Итак, если вы говорите, что написание системы сопоставления заказов, задержка в сети будет представлять, как скоро в вашей сети вы могли бы получить запрос соответствия заказа. Задержка обработки будет представлять время, затраченное вашим приложением, чтобы соответствовать Приложению против существующих открытых заказов.

Многоадресная рассылка, UDP, надежная многоадресная передача, обход ядра (поддерживается Java 7, Informatica Ultra Messaging и многие другие) в сетях Infiniband - это некоторые распространенные технологии, используемые всеми компаниями в этой области.

Кроме того, существуют механизмы программирования с малой задержкой, такие как disruptor (http://code.google.com/p/disruptor/), которые реализуют шаблоны проектирования для работы с приложениями с низкой задержкой. То, что может вас убить, - это писать в файлы базы данных или журналов в рамках основного рабочего процесса. Вам придётся придумать уникальные решения, которые отвечают требованиям проблемы, которую вы пытаетесь решить.

В таких языках, как Java, внедрение вашего приложения таким образом, что он создает (почти) нулевой мусор, становится чрезвычайно важным для латентности. Как говорит Адамски, знание модели памяти Java чрезвычайно важно. Понимать различные реализации JVM и их ограничения. Типичные шаблоны проектирования Java вокруг создания небольших объектов - это первые вещи, которые вы выкинете из окна - никогда нельзя исправить сборщик мусора Java достаточно для достижения низкой латентности - единственное, что можно исправить - это мусор.

Удачи вам!

6

В этом посте есть много хорошего ответа. Я хотел бы добавить свой опыт и

  • Для достижения низкой латентности в Java вы должны взять под свой контроль GC в Java, есть много способов сделать это, например, для предварительного выделения объектов (т.е. использовать наилегчайшем шаблон проектирования), используйте примитивные объекты - для них очень хороша, все структуры данных основаны на примитиве, Экземпляр объекта повторного использования, например, для создания системного словаря, чтобы уменьшить создание новых объектов, очень хороший вариант при чтении данных из потока/сокета/db

    • Попытайтесь использовать безжизненный алгоритм (это немного сложно), свободный от блокировки алгоритм. Вы можете найти тонны примера для этого

    • Использование в памяти вычислений. Память дешевая, вы можете иметь tera байт данных в памяти.

    • Если вы можете освоить бит-мудрый алгоритм, то он дает очень хорошую производительность.

    • Использование Mechnical симпатия - Смотрите Lmax дезинтегратор, отличные рамки

3

Если вы заинтересованы в Java с низкой задержкой разработки, вы должны знать, что это может быть сделано без RTSJ (Реального Время) JVM при условии, что вы держите сборщик мусора под контролем. Я предлагаю вам взглянуть на this article, в котором рассказывается о Java Development без накладных расходов GC. У нас также есть много других статей в our site, в которых рассказывается о компонентах Java с низкой задержкой.

2

Я хотел бы высказать некоторые замечания по программированию с низкой задержкой. В настоящее время я имею более чем 5-летний опыт разработки низкозатратных и высокопроизводительных механизмов в финансовом программном обеспечении.

Необходимо ли понимать, что такое латентность?

Задержка означает, что для завершения процесса требуется время. Это не обязательно зависит от используемых вами инструментов разработки, таких как java, C++, net и т. Д., Это зависит от ваших навыков программирования и системы.

Предположим, вы используете java, но одна ошибка может затянуться в процессе. Например, вы разработали торговое приложение, в котором при каждом обновлении цены вы вызываете некоторые функции и так далее. Это может привести к дополнительным переменным, ненужным использованию памяти, ненужным циклам, которые могут вызвать задержку в процессе. Такое же приложение, разработанное в .net, может работать лучше, чем Java, если разработчик заботился о вышеупомянутых ошибках.

Это также зависит от вашей серверной системы, так как многопроцессорная система может хорошо работать, если ваше приложение многопоточно.

Смежные вопросы