2011-12-19 2 views
2

Hy,Java: используйте Disruptor или Not. ,

В настоящее время я разрабатываю программу, которая принимает 2 значения из очереди amq и выполняет серию математических вычислений на них. Тема была создана на сервере amq, к которому моя программа подписывается и получает сообщения через обратные вызовы (слушатели).

Теперь, когда приходит сообщение, два значения извлекаются из объекта SynchronizedDescriptiveStatistics и добавляются в него. После каждого добавления в список значений вся последовательность вычислений выполняется снова и снова (это фактически является частью требования).

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

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

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

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

Ждет ответа. , ,

С уважением.

ответ

12

Я дам наш типичный ответ на этот вопрос: сначала проверьте, и сделайте свое решение на основе ваших результатов.

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

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

Сначала измерьте и решите, основываясь на ваших результатах.