设计storm拓扑以处理和持久化网页上的使用度量

p8ekf7hl  于 2021-06-24  发布在  Storm
关注(0)|答案(1)|浏览(259)

关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。

6年前关门了。
改进这个问题
我们正在开发一个web应用程序,它有一个基于用户使用应用程序的方式生成度量的功能。我们正在探索使用storm来处理用户事件并生成度量。
我们正在规划的高级别方法:
在客户端(浏览器),一个java脚本组件,用于捕获用户事件并将事件发布到服务器,事件消息将发布到rabbitmq。
风暴喷口消耗来自rabbitmq的消息。
storm bolt处理消息并计算度量。
最后指标保存到mongodb
问题:
bolt在保存到mongodb之前必须累积事件的度量,原因有两个:需要避免mongodb上的io负载,度量逻辑依赖于多个事件。所以我们需要对bolt有间歇性的持久性,并且不影响性能。
我们如何在storm拓扑中添加临时持久性,同时计算从rabbitmq提取的数据的统计信息,然后仅在某个时间间隔或某个其他逻辑触发器上将度量保存到永久持久性mongodb。

xytpbqjk

xytpbqjk1#

请澄清,如果我没有完全回答您的问题,但您的查询的一般要点似乎与主题相呼应:当我们计算从rabbitmq提取的数据的统计信息时,如何在我们的storm拓扑中保持一致?
幸运的是,storm已经考虑了这个问题,并开发了storm trident,它对传入的元组执行实时聚合,并允许拓扑为drpc查询以及需要高可用性和持久性的情况持久化聚合状态。
例如,在您的特定场景中,您将拥有这种三叉戟拓扑:

TridentTopology topology = new TridentTopology();
 TridentState metricsState = topology.newSpout(new RabbitMQConsumer())
    .each(new Fields("rawData"), new ComputeMetricsFunction(), new Fields("output"))
    .groupBy(new Fields("output"))
    .persistentAggregate(new MemoryMapState.Factory(), new AggregatorOfYourChoice(), new Fields("aggregationResult"))

注意:代码不是100%准确,但应该更多地视为伪代码。有关特定于代码的实现,请参见nathan的字数计算示例(https://github.com/nathanmarz/storm/wiki/trident-tutorial).

相关问题