核心概念
Trident在读写有状态的数据源方面是有着一流的抽象封装;状态即可以保留在topology的内部,如内存(但易丢失,服务器重启后不可用),也可以放到外部存储当中,如HDFS,Memcached(内存级数据库)或no-sql数据库(如Hbase)。这些都是使用同一套Trident API。
Trident以一种容错的方式来管理状态(状态指结果数据),以至于当你在更新状态的时候你不需要去考虑错误以及重试的情况。这种保证每个消息被处理有且仅有一次的原理会让你更放心的使用Trident的topology。
回顾之前讲解事务章节时:
Spout类型 | DB中存储 |
---|---|
普通Spout | [count = 3] |
事务Spout | [txid = 1, count = 3] |
不透明事务Spout | [txid = 2, value = 3, prevValue = 1] |
核心概念state及API
Opaque transactional state有着最为强大的兼容性,但是这是以存储更多的信息作为代价的。transactional states需要存储较少的状态信息,但是仅能和transactional spouts协同工作。最后,non-transactional state所需要存储的信息最少,但是却不能实现有且仅有一次被成功处理的语义。
state和spout类型的选择其实是一种在容错性和存储消耗之间的权衡,根据应用的需要会进行选择。
State API
Trident把所有容错相关的逻辑都放在了state里面。作为一个用户,你并不需要自己去处理复杂的txid,存储多余的信息到数据库中,或者是任何其他类似的事情。
TridentTopology topology = new TridentTopology();
TridentState wordCounts = topology.newStream("spout1", spout)
.parallelismHint(16)
.each(new Fields("sentence"), new Split(), new Fields("word"))
.groupBy(new Fields("word"))
.persis