我们正在尝试构建一个实时通知系统,并使用apachestorm来实现它。
为此,我们有一个消息代理(rabbitmq),它负责从发布服务器获取数据,并在订阅服务器端使用listners将数据推送到订阅服务器。
现在,我需要对messagebroker接收到的每个事件进行一些处理(对数据库进行一些调用,并在此基础上决定是否进一步处理它)。
理想情况下,storm应该从流中读取事件数据(在本例中是messagebroker)。但是,既然我们必须对事件进行一些操作,并决定是否应该将其送入螺栓进行处理,那么我应该在喷口内执行该逻辑,还是让一个单独的组件(比如一种调度器)将其发送到喷口。基本上,喷口应该包含任何类型的业务逻辑吗?同时,考虑到我们在一秒钟内有数百万的事件要发生,这是否足够好把这么多的负载放在喷口上。
1条答案
按热度按时间fcwjkofz1#
基本上,把逻辑放在一个喷口里是没有问题的。您只需要考虑以下几点:执行该方法的线程
Spout.nextTuple()
有一些额外的职责。例如,它接收已处理元组的ack和fail消息,并使发出的元组超时(如果没有及时接收到ack)。要做到这一点,重要的是,你不要停留在“永远”(即循环或块)中.nextTuple()
但是在向系统发出一个元组之后返回(或者如果没有元组可以发出,则返回,但不能阻塞)。否则,喷口不能正常工作。nextTuple()
将在Storm中循环调用。因此,在处理ack/fail消息等之后,下一次调用nextTuple()
发生得很快。在您的例子中,如果您在检查元组之后返回,那么它是否需要处理应该是确定的。刚从这里回来
.nextTuple()
丢弃或向系统发出单个元组之后。你可能想考虑一下,你需要多少时间才能得出一个关于一个元组的结论,也就是说,你在其中花费的时间nextTuple()
. 如果太长,可能需要增加消息超时时间。