在Esper中使用上下文分区

时间:2015-08-18 04:39:44

标签: esper

我是Esper的新手,我在上下文分区工作时遇到了麻烦。

我有两个事件流: - PositionEvent(投资组合,合约,positionAmount) - ContractEvent(合同,基础)

我想要得到的输出如下:

| portfolio | underlying | positionAmount |
| A         | X          |            100 |
| A         | Y          |            200 |
| B         | X          |            300 |
| B         | Y          |            400 |

为此,我创建了一个新架构:

create schema PortfolioByUnderlying 
  (portfolio string, underlying string, positionAmount double)

窗口定义如下:

create window PortfolioByUnderlyingWindow.std:unique(portfolio, underlying)
  as PortfolioByUnderlying

insert into PortfolioByUnderlyingWindow
select PositionEvent.portfolio as portfolio, 
       ContractEvent.underlying as underlying,
       SUM(positionAmount) as positionAmount    
from PositionEvent.std:unique(contract, portfolio),   
     ContractEvent.std:unique(contract)
where PositionEvent.contract = ContractEvent.contract
group by portfolio, underlying

然后我有10到100个客户端,这些客户端都在这个窗口上做了一个简单的选择,可选择一个过滤器,例如:select * from PortfolioByUnderlyingWindow where positionAmount > 0

我得到了所需的结果 - 但无论我使用多少线程,它都会执行相同的操作(就每秒传入的PositionEvent事件数而言)。我已经在具有20个入站线程的20核心机器上尝试过它,当我关闭入站线程池时,我几乎没有提升。

我在性能文档(http://www.espertech.com/esper/release-5.2.0/esper-reference/html/performance.html#perf-tips-13)中读到要处理这个问题,我应该使用上下文分区。我已经按照这个例子添加了这个:

create context SegmentByUnderlyingPortfolio 
  partition by portfolio, underlyingId from PortfolioByUnderlying

从我的插入中删除组:

insert into PortfolioByUnderlyingWindow
select PositionEvent.portfolio as portfolio, 
       ContractEvent.underlying as underlying,
       SUM(positionAmount) as positionAmount    
from PositionEvent.std:unique(contract, portfolio),   
     ContractEvent.std:unique(contract)
where PositionEvent.contract = ContractEvent.contract

在我的选择查询中设置上下文:

context SegmentByUnderlyingPortfolio 
select * from PortfolioByUnderlyingWindow where ...

但这并不起作用,我没有收到任何错误,但是我的监听器不再收到更新通知(我发送了10k PositionEvents,并且update方法被调用一次,newEvents和oldEvents都为null)。

我尝试了各种变体(例如将上下文放在窗口本身上),但无法获得任何更新。

我做错了什么,或者我是否完全错过了上下文?如果上下文分区不是正确的方法,我还能做些什么来更好地利用我机器上的所有内核?

1 个答案:

答案 0 :(得分:0)

您的陈述与上下文无关。即“context SegmentByUnderlyingPortfolio插入到PortfolioByUnderlyingWindow ...”和“context SegmentByUnderlyingPortfolio创建窗口PortfolioByUnderlyingWindow”。 从我可以看到你的EPL只是创建上下文而不是实际关联任何语句所以它没有被使用。文档中有一些例子。确保所有语句使用“context xxx ....”定义其上下文。 散列桶上下文提供最佳性能,因为引擎不需要检查分区是否存在。使用分区上下文时,您需要检查是否存在分区,因此会产生更多开销。我建议使用带有64个分区的哈希分段上下文。