有状态和无状态流处理
stateful and stateless streaming processing
在开始学习流处理的过程中,听到以下两个技术问题:有状态流处理和无状态流处理,它们有什么区别?听说storm是无状态的,而storm trident是有状态的,所以在实践中,哪里用storm,哪里用storm trident?
两者之间的区别在于,在非常高的层次上,您必须对它们执行的操作类型。
有些操作是无状态的,也就是说,您一次处理一条记录。
想想一个银行出纳员,它一次处理一连串的客户。每个客户都是一个新的工作单元,不依赖于以前的工作单元。
有状态操作就像雇用一名新员工。你面试的人络绎不绝,但你招不招人,要看你的状态,也就是你有什么空缺职位。
例如,假设您正在处理网络日志。如果你想知道每秒有多少用户在查看一个页面,你的处理是 几乎 无状态的:你每秒计算每个页面有多少用户。每一秒,你都不关心前一秒的结果。那就是无状态操作。
假设您想要计算下一秒将拥有多少用户的预测值。你想平均最后 10 分钟,所以你需要保持一个队列与最后 10 * 60 秒 - 这是你需要保留的 state 你的处理,你需要更新它每一秒,保持最近10分钟的状态。
那当然是有状态的操作。
一个更简单的有状态操作只是计算自站点开始以来的页面浏览总数。
这两个操作之间的一个关键区别是,如果流停止并且您重置了系统,您必须注意保存状态。
无状态操作没有任何状态可保存,因此通常更简单。
在开始学习流处理的过程中,听到以下两个技术问题:有状态流处理和无状态流处理,它们有什么区别?听说storm是无状态的,而storm trident是有状态的,所以在实践中,哪里用storm,哪里用storm trident?
两者之间的区别在于,在非常高的层次上,您必须对它们执行的操作类型。
有些操作是无状态的,也就是说,您一次处理一条记录。 想想一个银行出纳员,它一次处理一连串的客户。每个客户都是一个新的工作单元,不依赖于以前的工作单元。
有状态操作就像雇用一名新员工。你面试的人络绎不绝,但你招不招人,要看你的状态,也就是你有什么空缺职位。
例如,假设您正在处理网络日志。如果你想知道每秒有多少用户在查看一个页面,你的处理是 几乎 无状态的:你每秒计算每个页面有多少用户。每一秒,你都不关心前一秒的结果。那就是无状态操作。
假设您想要计算下一秒将拥有多少用户的预测值。你想平均最后 10 分钟,所以你需要保持一个队列与最后 10 * 60 秒 - 这是你需要保留的 state 你的处理,你需要更新它每一秒,保持最近10分钟的状态。 那当然是有状态的操作。 一个更简单的有状态操作只是计算自站点开始以来的页面浏览总数。
这两个操作之间的一个关键区别是,如果流停止并且您重置了系统,您必须注意保存状态。 无状态操作没有任何状态可保存,因此通常更简单。