我一直在学习 Storm 和 Samza,以了解流处理引擎的工作原理,并意识到它们都是独立的应用程序,为了处理事件,我需要将其添加到也连接到流处理引擎的队列中。这意味着我需要将事件添加到队列(这也是一个独立的应用程序,比如说 Kafka),Storm 将从队列中选择事件并在工作进程中处理它。如果我有多个螺栓,每个螺栓将由不同的工作进程处理。(这是我不太了解的事情之一,我看到一家公司在生产中使用了 20 多个螺栓,并且每个事件在某个路径的螺栓之间转移)
但是我真的不明白为什么我需要如此复杂的系统。这些进程涉及太多的 IO 操作(我的程序 -> 队列 -> 风暴 ->> 螺栓),这使得控制和调试它们变得更加困难。
相反,如果我从 Web 服务器收集数据,为什么不直接使用同一个节点进行事件处理呢?这些操作已经通过我用于 Web 服务器的负载均衡器分布在节点上。我可以在相同的 JVM 实例上创建执行器,并将事件从 Web 服务器异步发送到执行器,而不涉及任何额外的 IO 请求。我还可以观察 Web 服务器中的执行程序,并确保执行程序处理了事件(至少一次或完全一次处理保证)。这样,管理我的应用程序会容易得多,并且由于不需要太多的 IO 操作,因此与通过网络将数据发送到另一个节点的其他方式相比,它会更快(这也是不可靠的)并在该节点中处理它。
很可能我在这里遗漏了一些东西,因为我知道许多公司都在积极使用 Storm,而且我认识的许多人推荐使用 Storm 或其他流处理引擎进行实时事件处理,但我就是不明白。