Mongodb 设计Storm拓扑以处理和保持网页上的使用指标

Mongodb 设计Storm拓扑以处理和保持网页上的使用指标,mongodb,apache-storm,Mongodb,Apache Storm,我们正在开发一个web应用程序,它有一个根据用户使用应用程序的方式生成度量的功能。我们正在探索使用Storm来处理用户事件并生成度量 我们正在规划的高级别方法: 在客户端(浏览器),一个Java脚本组件,用于捕获用户事件并将事件发布到服务器,事件消息将发布到RabbitMQ 风暴喷口消耗来自RabbitMQ的消息 Storm bolt处理消息并计算指标 最后,指标保存到MongoDB 问题: Bolt在保存到MongoDB之前必须累积事件的度量,原因有两个,需要避免MongoDB上的IO负载,并

我们正在开发一个web应用程序,它有一个根据用户使用应用程序的方式生成度量的功能。我们正在探索使用Storm来处理用户事件并生成度量

我们正在规划的高级别方法:

  • 在客户端(浏览器),一个Java脚本组件,用于捕获用户事件并将事件发布到服务器,事件消息将发布到RabbitMQ
  • 风暴喷口消耗来自RabbitMQ的消息
  • Storm bolt处理消息并计算指标
  • 最后,指标保存到MongoDB
  • 问题:

    Bolt在保存到MongoDB之前必须累积事件的度量,原因有两个,需要避免MongoDB上的IO负载,并且度量逻辑依赖于多个事件。因此,我们需要螺栓具有间歇性持久性,并且不影响性能


    我们如何在storm拓扑中添加临时持久性,同时对从RabbitMQ提取的数据进行统计,然后将度量保存到永久持久性MongoDB,仅在某个时间间隔或其他逻辑触发器上进行。

    如果我没有完全回答您的问题,请澄清,但您的查询的一般要点似乎与主题相呼应:在计算从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的单词计数示例,了解特定于代码的实现()。

    是的,这正是我的问题。风暴三叉戟,它和三叉戟不同吗?有可能将Storm Trident作为Storm的插件吗?Trident只是栓嘴拓扑的更高级别抽象。它允许您创建更复杂的拓扑,如您描述的拓扑,而无需担心螺栓和喷嘴的更高级别连接以保持状态。看看我发给你的链接,你会更清楚的。