在Redis重新启动时自动将Storm拓扑重新连接到Redis群集

Ana*_*ain 9 java redis jedis apache-storm redis-cluster

我创建了一个Storm拓扑,它使用Jedis库连接到Redis Cluster.Storm组件总是希望Redis启动并运行,然后才连接到Redis并订阅事件.目前我们使用Redis的pub-sub策略.

下面是代码示例,它解释了Storm中为Redis提供的Jedis连接.

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();
Run Code Online (Sandbox Code Playgroud)

预期的行为

一旦Redis去世并重新上线,预计Storm将确定Redis的状态.如果Redis死机并上线,则无需重启.

实际行为

一旦Redis因任何原因重新启动,我总是必须重新启动Storm拓扑,然后才开始收听Redis.

Redis重启后,如何让Storm监听并重新连接到Redis?任何指导将不胜感激,即.docs,论坛答案.

小智 -1

这是 apache-storm 的一个常见问题,其中连接线程在过时的情况下仍处于活动状态,尽管您使用的源已关闭/重新启动。理想情况下,它应该重试创建新的连接线程,而不是重用现有的连接线程。因此,我们的想法是通过检测异常(例如,JMS 中的 JMSConnectionError)来使其自动化。

请参阅此故障转移消费者示例,它将让您简要了解在这种情况下该怎么做。(PS 这是 JMS,在您的情况下是 Redis 中的 JMS。)

步骤大概是这样的。

  1. 在发生错误或连接丢失时捕获异常。
  2. 从 catch 中初始化连接(如果不是由程序自愿关闭)。
  3. 如果异常到达步骤 1。