大数据技术分享

Storm容错机制(一):ACK机制

2019-06-20  本文已影响29人  code_solve

前言

好久没有写文章了,然后一连就写了三篇,
前两篇文章
Storm入门(一):编程模型
Storm入门(二):架构模型和集群部署
都是一些比较简单的入门教程,这一篇我们来聊一聊稍微高级点的话题,
关于 Storm 的 ACK 机制。

不过话又说回来,其实大数据领域,该机制还是显得比较鸡肋的!!!

ACK机制有什么用?

我们知道 Storm 是一个常驻服务,消息源源不断的来,他源源不断的处理,那肯定在有些情况下会导致消息的不正确处理,比如worker进程挂掉了,那么正在被处理的消息很可能就会丢失掉,那么该如何解决这个问题呢?这时候我们就可以引入 ACK 机制了,当消息没有被正确处理时,可以通过 ACK机制 重新发送该消息进行处理。

当然,大多数时候,一条两条数据的异常,并不在我们的考虑范围内,所以并不是所有任务都要引入 ACK 机制

开启 ACK 机制

  1. spout 发送 tuple 的时候需要指定该消息的 messageId
    SpoutOutputCollector.emit(List<Object> tuple, Object messageId)
  2. spout要重写BaseRichSpout的fail和ack方法
 static class MySpout extends BaseRichSpout {
        @Override
        public void fail(Object msgId) {
          //消息失败的时候回回调到这个方法
        }

        @Override
        public void ack(Object msgId) {
          //消息成功执行的时候回回调到这个方法
        }
    }

你可能已经发现这两个回调的参数是 msgId,而不是你发送的 message,所以这个时候需要我们自己在发送数据的时候维护一个缓存,在 ack 回调里面移除, 在 fail 里面重发。

  1. Bolt 发送消息的时候需要将原消息当做 anchor 发送
    OutputCollector.emit(Tuple anchor, List<Object> tuple)
  2. 设置acker数至少大于0:
    Config.setNumAckers(1);

上面介绍了如何开启一个 ACK,实际上我们也看到了,ACK机制的控制是精确到了 message 的,比如我们Spout 发送这个 message 的时候不指定其 messageId,那么这个message 的数据流就不会被 ACK,

ACK 原理

好吧,ACK的讲解就到这里了,不知道有没有讲清楚,不过实际运用中并没有太大的用处,也可能只是我目前用的不多,基于对一门技术的热情,还是稍稍深入研究了一下,如有不对,欢迎指错

你的点赞是对作者最大的支持

上一篇 下一篇

猜你喜欢

热点阅读