一.ack-fail机制
storm处理消息时,一秒钟可能有成千上万个tuple.有一个tuple失败整个过程就失败了.所以为了确保消息不丢失.知道是那个tuple环节出了问题,storm提供了ack-fail机制.而如果tuple出了问题,需要数据,所以传过来了就将数据缓存,以便fail方法调用.成功了就移除数据.释放资源.
1.需要ackfail时,请为每个tuple生成一个messageID,这个messageId是用来标识你关系的tuple,当这个tuple被完全处理时,storm框架会调用Spout的ack 方法,否则调用fail.至于消息是否重发,完全由自己处理
MySpout{
private Map buffer = new HashMap();
spout.open()
spout.nextTuple(){
collector.emit()
buffer.put(msgId,messValue)
}
spout.outputFields()
spout.ack(msgId){
//消息移除
buffer.remove(msgId);
}
spout.fail(){
//消息重发
String messValue = buffer.get(msgId)
collector.emit();
}
}
MyBolt{
bolt.execute(){
//先判断消息是否被处理过 (开启ack-fail)
//在redis或mysql中保存一个处理过的消息列表
//需要手动的调用ack方法
collector.ack(tuple);
}
}
2.在spout有并发度的情况下,storm会根据t