Программирование с низкой задержкой - PullRequest
42 голосов
/ 31 июля 2009

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

Ответы [ 12 ]

45 голосов
/ 08 ноября 2010

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

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

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

24 голосов
/ 06 ноября 2011

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

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

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

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

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

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

Удачи!

8 голосов
/ 10 октября 2012

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

  • Чтобы достичь низкой задержки в Java, вы должны взять под контроль GC в Java, есть много способов сделать это, например, для предварительного выделения объектов (т. Е. Использовать шаблон проектирования flyweight), использовать примитивные объекты - trove очень хорошо для этого, все структуры данных основаны на примитиве, Повторное использование экземпляра объекта, например, для создания общесистемного словаря, чтобы уменьшить создание новых объектов, очень хороший вариант при чтении данных из потока / сокета / DB

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

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

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

    • Используйте механическое сочувствие - см. Lmax disruptor, отличные рамки

5 голосов
/ 03 октября 2009

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

4 голосов
/ 17 сентября 2014

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

Нужно ли понимать, что такое задержка?

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

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

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

4 голосов
/ 12 июня 2014

Если вы заинтересованы в разработке Java с малой задержкой, вы должны знать, что это можно сделать без RTSJ (Real-Time) JVM при условии, что вы будете держать сборщик мусора под контролем. Я предлагаю вам взглянуть на эту статью , в которой говорится о разработке на Java без издержек GC. У нас также есть много других статей на нашем сайте , в которых говорится о компонентах Java с малой задержкой.

4 голосов
/ 08 ноября 2010

Посмотрите на ZeroMQ. http://www.zeromq.org

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

4 голосов
/ 31 июля 2009

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

2 голосов
/ 30 декабря 2010

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

1 голос
/ 21 декабря 2010

http://g -wan.com / делает все это за 200 КБ с помощью скриптов ANSI C.

...