Apache Storm 与 Spring 框架集成

Apache Storm integration with Spring framework

我是 Apache Storm 的新手。目前我正在处理涉及使用 Apache Storm 进行流处理的遗留项目。我想将当前项目与 Spring 集成。我发现一些评论 (Storm and Spring 4 integration, http://mail-archives.apache.org/mod_mbox/storm-user/201605.mbox/%3CCAMwbCdz7myeBs+Z2mZDxWgqBPfjcq-tynOz_+pmPrmY6umfUxA@mail.gmail.com%3E) 说有人担心这样做。有人可以向我解释如何进行这样的集成或为什么不可能吗?

公平警告,我没有在 Storm 中使用过 Spring,所以这完全基于我对 Storm 的了解,并且在非 Storm 项目中使用过 Spring,即这确实是只是猜测。

我认为您可以将 Spring 与 Storm 一起使用,但您应该注意一些注意事项。考虑到这些注意事项,Spring 是否仍然值得使用取决于您。

不同于例如Spring MVC 应用程序,Spring 将不负责对象实例化或应用程序流程。 Storm 不知道 Spring,当你 运行 你的拓扑结构时,Storm 会调用你的 bolt/spout 方法。这意味着您必须意识到您的应用程序的某些部分将在 Spring 上下文之外被调用。

这是我对在拓扑部署的不同阶段可以在哪里使用 Spring 的猜测。

  • 当您设置拓扑并提交它时(您的所有代码直至并包括 StormSubmitter.submitTopology),您很可能可以像在任何情况下一样使用 Spring独立 Java 应用程序。例如您可以像在 this example 中一样启动您的应用程序,并将所有提交和接线代码放在 Main.start 中。所有 bolt/spout 构造函数将在此阶段 运行 ,因此如果您愿意,可以在此处使用自动装配。你必须确保你的 spouts 和 bolts 是可序列化的。

  • 拓扑提交后,Storm 将序列化您的 spouts 和 bolts(以及这些对象中的任何非瞬态字段),并将它们发送到监督机器,在那里它们将被反序列化。此时,如果你需要一个在 worker 中可用的上下文,你可以在 worker hook 中创建一个(通过 TopologyBuilder.addWorkerHook 添加到拓扑中),并通过钩子上的静态方法公开它(这是有点难看,但我没有看到任何其他方法可以让它对代码的其他部分可用)。

重申一下,如果您决定 运行 在您的 worker 中使用 Spring 上下文,您必须意识到 spout/bolt 方法将由 Storm 在 Spring上下文。