4

SubscriptionWithEventHandlerExample我根据API 3.2.9.0的例子用 c# 编写了一个程序。在订阅了大约 500 只证券以获取实时数据后,我收到了一些 ADMIN 事件警告SlowConsumerWarning,声称SlowConsumerWarningCleared. 我在某处读到它引入了一些延迟,直到我处理所有事件。

问题是在我的代码中我只收到来自彭博社的回调。事件队列甚至不在我的程序中!

我尝试过的一些事情:

  1. 提高队列限制,在会话选项中设置 MaxEventQueueSize(好像没有效果)

  2. 看看我是否收到任何超时事件(不,我没有收到任何超时事件)

  3. 创建多个会话并在每个会话中订阅 50 个证券(现在我收到多个警告,每个线程一个)

有什么我可以做的,或者这种行为超出了我的范围吗?

4

3 回答 3

4

您可以在专用线程中处理数据,只让 Bloombergcallbacks将数据排队。您的数据处理线程将从队列中读取数据并执行任何耗时的工作。这可能会解决您的问题,具体取决于触发SlowConsumerWarning. 但是,如果您处理数据的代码太慢,您的队列会随着时间的推移而填满。

于 2010-04-09T12:56:39.293 回答
3

Bloomberg API 和相关进程在内部是多线程的。如果您订阅实时源并且没有足够快地处理事件以使事件在内部开始在 Bloomberg API 中备份,则 API 将发出缓慢的消费者警告。我认为在这个阶段它也可能开始限制或丢弃事件。您是否在事件回调中做一些耗时的事情(写入数据库)?

底线是,如果您订阅 500 个证券事件的实时数据,您的事件处理必须跟上您订阅的数据流。

于 2010-04-11T11:09:56.600 回答
1

我不确定它是否适用于上述问题,但它可能会阐明一种可能性。

如果您请求的数据会导致 Bloomberg API 生成大量事件(例如长时间的历史盘中数据请求,或者可能是实时订阅),请不要使用 API 文档中指定的模式,因为它可能最终会导致使您的应用程序检索所有事件的速度非常慢。基本上,不要在 Session 对象上调用 NextEvent(),而是使用专用的 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 不是特别确定性...

于 2011-05-25T15:51:36.373 回答