Bloomberg APIv3 возвращает медленные предупреждения потребителей - PullRequest
4 голосов
/ 08 апреля 2010

Я создал программу на c # на примере SubscriptionWithEventHandlerExample API 3.2.9.0. После подписки примерно на 500 ценных бумаг для данных в реальном времени я получаю некоторые предупреждения о событиях ADMIN, требующие SlowConsumerWarning и SlowConsumerWarningCleared. Я где-то читал, что это вносит некоторую задержку, пока я не обработаю все события.

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

Некоторые вещи, которые я пробовал:

  1. поднять предел очереди, установив MaxEventQueueSize в параметрах сеанса (кажется, не имеет никакого эффекта)

  2. посмотреть, получу ли я какое-либо событие тайм-аута (нет, я не получу)

  3. создать несколько сессий и подписать 50 ценных бумаг в каждой (теперь я получаю несколько предупреждений, по одному на каждую ветку)

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

Ответы [ 3 ]

4 голосов
/ 09 апреля 2010

Вы можете выполнить обработку данных в выделенном потоке и позволить Bloomberg callbacks ставить в очередь данные. Ваш поток обработки данных будет читать данные из очереди и выполнять любую трудоемкую работу. Это может решить вашу проблему, в зависимости от того, что вызывает SlowConsumerWarning. Если ваш код для обработки данных слишком медленный, ваша очередь со временем будет заполняться.

3 голосов
/ 11 апреля 2010

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

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

1 голос
/ 25 мая 2011

Я не уверен, относится ли это к вышеуказанному вопросу, но, вероятно, он пролил свет на эту возможность.

Если вы делаете запрос на данные, который приводит к большому количеству событий, сгенерированных API Bloomberg (таких как длинный запрос данных за прошлый день или, возможно, подписки в реальном времени), не используйте шаблон, указанный в документации API, так как может привести к тому, что ваше приложение будет очень медленно извлекать все события. По сути, не вызывайте NextEvent () для объекта Session, вместо этого используйте выделенный EventQueue.

Вместо этого:

var cID = new CorrelationID(1);
session.SendRequest(request, cID);
do {
   Event eventObj = session.NextEvent();
   ...
}

Сделайте это:

var cID = new CorrelationID(1);
var eventQueue = new EventQueue();
session.SendRequest(request, eventQueue, cID);
do {
   Event eventObj = eventQueue.NextEvent();
   ...
}

Это может привести к некоторому улучшению производительности, хотя известно, что API не является особенно детерминированным ...

...