storm是如何保证at least once语义的

本文详细解析了storm如何通过tuple、acker和DAG来保证消息至少处理一次的语义。spout发送tuple并请求acker确认,acker通过追踪tuple的处理状态,向源头发送确认或失败消息,实现消息的重放或丢弃,从而确保消息处理的可靠性。
摘要由CSDN通过智能技术生成

背景

本篇看看storm是通过什么机制来保证消息至少处理一次的语义的。

storm中的一些原语

这里写图片描述
要说明上面的问题,得先了解storm中的一些原语,比如:

  1. tuple和message
    在storm中,消息是通过tuple来抽象表示的,每个tuple知道它从哪里来,应往哪里去,包含了其在tuple-tree(如果是anchored的话)或者DAG中的位置,等等信息。

  2. spout
    spout充当了tuple的发送源,spout通过和其它消息源,比如kafka交互,将消息封装为tuple,发送到流的下游。

  3. bolt
    bolt是tuple的实际处理单元,通过从spout或者另一个bolt接收tuple,进行业务处理,将自己加入tuple-tree(通过在emit方法中设置anchors)或DAG,然后继续将tuple发送到流的下游。
  4. acker
    acker是一种特殊的bolt,其接收来自spout和bolt的消息,主要功能是追踪tuple的处理情况,如果处理完成,会向tuple的源头spout发送确认消息,否则,会发送失败消息,spout收到失败的消息,根据配置和自定义的情况会进行消息的丢弃、重放处理。

spout、bolt、acker的关系

  1. spout将tuple发送给流的下游的bolts.
  2. bolt收到tuple,处理后发送给下游的bolts.
  3. spout向acker发送请求ack的消息.
  4. bolt向acker发送请求ack的消息.
  5. acker向bolt和spout发送确认ack的消息.

简单的关系如下所示:

这里写图片描述

上图展示了spout、bolts等形成了一个DAG,如何追踪这个DAG的执行过程,就是storm保证仅处理一次消息的语义的机制所在。

storm如何追踪消息(tuple)的处理

这里写图片描述

spout在调用emit/emitDirect方法发送tuple时,会以单播或者广播的方式,将消息发送给流的下游的component/task/bolt,如果配置了acker,那么会在每次emit调用之后,向acker发送请求ack的消息:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; spout向acker发送请求ack消息
;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; rooted?表示是否设置了acker
(if (and rooted?
        (not (.isEmpty out-ids)))
 (
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值