在redis重启时自动将storm拓扑重新连接到redis群集

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

我用绝地库创建了一个连接redis集群的storm拓扑。storm组件总是希望redis启动并运行,然后才连接到redis并订阅事件,目前我们使用redis的pub-sub策略。
下面是一个代码示例,解释了我在storm中与redis的绝地连接。

try {
    jedis.psubscribe(listener, pattern);
} catch(Exception ex) {
    //catch statement here.
} finally {
    pool.returnResource(jedis);
}

....

pool = new JedisPool(new JedisPoolConfig(), host, port); //redis host port

ListenerThread listener = new ListenerThread(queue, pool, pattern);
listener.start();

预期行为
一旦redis死掉并重新上线,storm有望确定redis的状态。当redis死掉并上线时,它一定不需要重启。
实际行为
一旦redis由于任何原因重新启动,我总是要重新启动storm拓扑,只有这样它才开始监听redis。
问题
在redis重启后,如何让storm监听并重新连接redis?如有任何指导,我们将不胜感激。文档,论坛答案。

mmvthczy

mmvthczy1#

这是apache storm的一个常见问题,在apache storm中,连接线程处于失效状态,尽管您使用的源代码已关闭/重新启动。理想情况下,它应该重试创建新的连接线程,而不是重用现有的连接线程。因此,我们的想法是通过检测异常(例如jms中的jmsconnectionerror)使其自动化。
请参阅这个故障转移消费者示例,它将为您简要介绍在这种情况下应该做什么(注意,这是jms,在您的redis中是jms)
台阶应该是这样的。
错误或连接丢失时捕获异常。
从catch初始化连接(如果不是由程序自动关闭)。
如果异常转到步骤1。

相关问题