我已阅读有关Apache风暴的内容,并做了一些基本的教程。我有以下拓扑结构,我想用storm实现,但不知道如何处理数据分发。 业务要求是 实时评估客户组合。 简化形式涉及: 1)接受市场价格的直播(货币,商品等......) 2)对于每个价格刻度计算每个头寸的当前利润并将其转换为客户账户货币 3)分析每个客户的所有头寸的总p / l和交易量,并在需要时生成信号 4)在客户级别,计算必须是顺序的和原子/序列化的。 即所有头寸必须按其进入系统的顺序进行评估,并且即使客户有100个头寸,也必须根据相同的价格计算总数。 5)分析按符号/客户类型/国家/等等汇总的系统中所有职位的数量/趋势,并使其在某种仪表板中可用。
所有订单都在rdbms中执行并存储。 我的主要问题是如何在不同节点上分布数千个位于Storm螺栓上的位置,每个节点都处理它自己的部分。使用Modulo足以分割客户,但我如何为每个螺栓实例提供id,以便每个人只处理它自己的同等部分客户? Storm中有没有开箱即用的东西? 另一个问题是如何有效地进行上述聚合?
答案 0 :(得分:0)
您可以使用fieldsGrouping
。您可以声明一个字段,将元组分组(在您的情况下为id
)。
我只是假设你的输入流是带有id和body字段的JSON对象,如
{"id":"1234","body":"some body"}
另外假设您的拓扑结构有一个喷口,两个螺栓,即BoltA和BoltB。
在BoltB中,覆盖declareOutputFields方法并填写详细信息。
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("id","log"));
}
您可以声明拓扑,如下所示
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout", spout, 1);
builder.setBolt("boltA", new BoltA(), 1)
.shuffleGrouping("spout");
builder.setBolt("counterBolt", new BoltB(), 1).fieldsGrouping("boltB", new Fields("id"));
在这种情况下,来自boltA
的具有相同ID的元组将被传递到boltB
的同一个实例