TridentSpout基于batch的组成方式三种类型:非事务型,事务型,非透明型。
非事务型:非事务型Spout不能为batch提供任何保证。
事务性:每个batch的txid保持不变,对于一个特定的txid重复执行时,batch中的内容保持不变,例如:
txid=1的batch发送的内容为123,执行失败重复发送时内容仍然为123。
非透明型:能够保证数据是非重复的,每个数据都会在有且仅有一个batch中执行成功,但不保证每个batch中的内容一样,例如:txid=1的batch发送的内容为123,执行失败重复发送时内容有可能变为124,其他batch中不会再出现1234的数据。
TridentState也分为三种类型:非事务型,重复事务型,不透明事务型。
非事务型:不保证任何状态信息
重复事务型:存储每个batch的txid,更新数据时根据txid来判断,当txid相同时不更新,不同时更新
不透明事务型:存储每个batch的txid以及上一个batch的数据,当txid不同时,更新当前值以及上一个状态的值,例如:存储的数据为:{ "value": 2, "prevValue": 1, "txid": 1 },当前的batch需要对value的值加2,当前的txid为2,更新后的数据为:{ "value": 4, "prevValue": 2, "txid": 2 },当txid相同是,说明上一个batch处理失败了,需要用本次的数据覆盖上一次的数据,更新后的数据为:{ "value": 3, "prevValue": 1, "txid": 1}
不同的spout和state能够实现唯一处理的对应关系为:
state | ||||
非事务型 | 事务型 | 不透明型 | ||
spout | 非事务型 | no | no | no |
事务型 | no | yes | yes | |
不透明型 | no | no | yes |