Это вопрос, над которым я работал несколько лет, но сейчас у меня все еще нет хорошего решения.
Мое приложение состоит из двух частей:
Первый работает на сервере, который называется «ROOT server». Он будет получать данные о запасах в реальном времени от HKEx (биржи ценных бумаг и фьючерсов в Гонконге) и транслировать их на 5 других дочерних серверов. Он добавит метку времени к каждому элементу данных при трансляции.
Вторые работают на «дочерних» серверах. Они получат данные о запасах от ROOT-сервера, проанализируют каждый из них и получат важную информацию. Наконец, они отправят их в новом текстовом формате клиентам. Число клиентов может составлять от сотен до тысяч, они могут зарегистрироваться на какие-то акции и получать информацию о них в реальном времени.
Производительность - самая важная вещь. В последние несколько лет я пробовал все известные мне решения, чтобы сделать это быстрее. «Быстрее» здесь означает, что первый получит и отправит данные на дочерние серверы так быстро, как сможет, а дочерние серверы получат и проанализируют и отправят данные клиентам так быстро, как смогут.
На данный момент, когда скорость передачи данных от HKEx составляет 200 КБ и имеется 5 дочерних серверов, первое приложение будет иметь задержку 10 мс для каждого элемента данных в среднем. И второе не легко проверить, это зависит от количества клиентов.
Что я использую:
- OpenSUSE 10
- Sun Java 5.0
- Мина 2,0
Аппаратное обеспечение сервера:
- 4-ядерный процессор (я не знаю тип)
- 4G баран
Я думаю о том, как улучшить производительность.
- Нужно ли использовать параллельный фреймворк как akka
- попробуйте другой язык, например Scala? C ++?
- использовать систему Java в реальном времени ?
- ваши советы ...
Нужна ваша помощь!
Обновление:
В приложениях записана важная информация для анализа, но я не вижу узких мест. HKEx предоставит больше данных в следующем году, я не думаю, что мое приложение будет достаточно быстрым.
Один из моих клиентов протестировал наше приложение, а другая - компанию, но у нас не было преимущества в скорости. Я просто хочу найти способ сделать это быстрее.
Как работает первое приложение
Первое приложение получит данные о запасах от HKEx и передаст их на несколько других серверов. Шаги:
- Соединяет HKEx
- логины
- читает данные. Данные представлены в двоичном формате, каждый элемент имеет заголовок, который составляет 2 байта целого числа, что означает длину тела, затем тело, затем следующий элемент.
- поместите их в хэш-карту в памяти. Ключ - это последовательность элементов, значение - байтовый массив.
- записать последовательность каждого полученного элемента на диск. Используйте буферное приложение log4j.
- поток демона пытается прочитать данные из hashmap и вставляет их в postgresql каждую 1 минуту. (это просто используется для резервного копирования данных)
- когда клиенты подключаются к этому серверу, он принимает их и пытается отправить все данные из hashmap из памяти. Я использовал пул потоков в минах, получатель и отправители находятся в разных потоках.
Я думаю, что логика очень проста. Когда было 5 клиентов, я следил за скоростью передачи не более 1,5 М / с. Я использовал java для написания простейшей сокетной программы и обнаружил, что она может быть 10M / s.
На самом деле, я потратил более 1 года, пробуя всевозможные решения для этого приложения, просто чтобы сделать его быстрее. Вот почему я чувствую отчаяние. Нужно ли использовать другой язык, кроме Java?
задержка около 10 мс
Когда приложение получит данные от HKEx, я запишу метку времени для этого.Когда корневой сервер передает данные на дочерние серверы, он добавляет к ним временную метку.
когда дочерние сервер получает данные, он отправляет сообщение корневому серверу, чтобы получить текущую временную метку, затем сравниваетих.
Итак, задержка 10 мс содержит:
- Корневой сервер получил данные ---> Дочерний сервер получил данные
- Дочерний сервер отправил запрос на rootотметка времени сервера ---> корневой сервер получил ее
Но вторая очень мала, поэтому мы можем ее игнорировать.