Подтвердить что ты не робот

Программирование с низкой задержкой

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

Удачи!

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

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

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

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

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

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

Ответ 9

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

Ответ 10

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

Ответ 11

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

Ответ 12

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