我是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)。
我尝试了各种变体(例如将上下文放在窗口本身上),但无法获得任何更新。
我做错了什么,或者我是否完全错过了上下文?如果上下文分区不是正确的方法,我还能做些什么来更好地利用我机器上的所有内核?
答案 0 :(得分:0)
您的陈述与上下文无关。即“context SegmentByUnderlyingPortfolio插入到PortfolioByUnderlyingWindow ...”和“context SegmentByUnderlyingPortfolio创建窗口PortfolioByUnderlyingWindow”。 从我可以看到你的EPL只是创建上下文而不是实际关联任何语句所以它没有被使用。文档中有一些例子。确保所有语句使用“context xxx ....”定义其上下文。 散列桶上下文提供最佳性能,因为引擎不需要检查分区是否存在。使用分区上下文时,您需要检查是否存在分区,因此会产生更多开销。我建议使用带有64个分区的哈希分段上下文。