Архитектура производителя-потребителя с Java RealTime - PullRequest
3 голосов
/ 28 ноября 2011

Я работаю над проектированием торговой системы с использованием Java Realtime (Sun JRTS 2.2) и хотел бы задать несколько вопросов о лучших практиках, потому что я боюсь изобретать колесо и почти уверен, что моя задача уже решена.

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

Так что я думаю, что я должен спроектировать эту систему, разделив ее на 2 части.Producer (периодический (?) Поток реального времени, который извлекает байты из сокета, анализирует его) и Consumer (поток реального времени (периодический / спорадический?), Который извлекает сообщения от производителя, манипулирует ими и т. Д.).

Итак, первый вопрос - как спроектировать высокопроизводительную связь между этими двумя потоками (производитель / потребитель)?Также я хотел бы услышать комментарии о существующем опыте в разработке таких систем, советы и т. Д.

Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 28 ноября 2011

Я работаю с похожей проблемой, но в другом домене:

Вот как я справился с этим:

public class Producer extends Thread{
   private BlockingQueue<E> consumerQueue = null;
   public setConsumerQueue(BlockingQueue<E> val){
      consumerQueue = val;
   }
   // main method where data is received from socket...
   public void run(){
      while(!interrupted()){
           data = socket.receive();// Receive data
           if(consumerQueue!=null) consumerQueue.offer(data);
      }
   }
}

public class Consumer extends Thread{
   private BlockingQueue<E> consumerQueue = new BlockingQueue<E>();
   public Consumer (Producer val){
      val.setConsumerQueue(consumerQueue);
   }
   public void run(){
      while(!interrupted()){
           data = consumerQueue.take();// block until there is data from producer
           if(data !=null) processData(data);
      }
   }
}
0 голосов
/ 28 ноября 2011

При принятии решения о том, как разбить ваше приложение, полезно иметь представление о том, сколько времени занимает каждый этап и какую обработку можно выполнять параллельно. Вы хотите рассчитать каждую стадию в микросекундах и измерить распределение. Наиболее интересные моменты - это задержки в 99% (наихудший 1%), 99,9% или 99,99%.


Я бы взглянул на библиотеку disruptor . Это библиотека общего назначения, предназначенная для высокой пропускной способности и низкой задержки.


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

Эта презентация может показаться интересной, хотя в основном она посвящена тестированию компонентов с низкой задержкой, высокой пропускной способностью и обмену данными через сокеты. http://vanillajava.blogspot.com/2011/11/low-latency-slides.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...