zoukankan      html  css  js  c++  java
  • Flume学习——Flume中事务的定义

    首先要搞清楚的问题是:Flume中的事务用来干嘛?

    Flume中的事务用来保证消息的可靠传递。

    当使用继承自BasicChannelSemantics的Channel时,Flume强制在操作Channel时采用特定的程序结构,并且强制channel实现特定的方法以使得Channel本身可以应对存入或取出失败的情况,并且使得channel的使用者有可能根据操作是否成功采取适当的方法。

    Channel在Flume的架构中主要起了缓存的作用,当使用FileChannel时,它是一个持久化的缓存。

    若把Channel类比为数据库,而把Flume的事务类比为数据库事务,那么Flume通过事务来确保Source和Sink采用特定的方式访问Channel,从而保证Channel状态的一致性。比如当一个事务中需要把一个batch的event全放入Channel时,需要确保这个操作是原子的,要不全放进去,要不一个不放。

    更高层次、更广范围的事务可以以此为基础构建。

    下面是Transaction注释中对Transaction使用的举例:

    org.apache.flume.Transaction
     

    Provides the transaction boundary while accessing a channel

    Transaction instance is used to encompass channel access via the following idiom:

    
     Channel ch = ...
     Transaction tx = ch.getTransaction();
     try {
       tx.begin();
       ...
       // ch.put(event) or ch.take()
       ...
       tx.commit();
     } catch (ChannelException ex) {
       tx.rollback();
       ...
     } finally {
       tx.close();
     }
     

    Depending upon the implementation of the channel, the transaction semantics may be strong, or best-effort only.

    Transactions must be thread safe. To provide a guarantee of thread safe access to Transactions, see BasicChannelSemantics and BasicTransactionSemantics.

    可实现这个的事务语法,需要几个类的合作, 需要这些类有特定的语法。包括Channel的语法和从Channel中获取的Transaction对象的语法。

    下面是事务有关的各个类

    其中AbstractChannel主要实现了NamedComponent、LifecycleAware和Configurable这几个基本的接口,和事务无关。

    BasicChannelSemantics实现在在local-thread中保存一个BasicTransactionSemantics对象的功能。它对Channel接口中take和put方法的实现为:确保当前的线程中有Transaction的一个可用的实例,然后把take和put代理给本线程transaction对象的同名方法。

    BasicTransactionSemantics确保了事务相关的操作只有按正确的顺序执行才可以。即tx.begin =》 channel.take/put =》 tx.commit =》  tx.close。它只保证了对Channel操作的顺序,由子类实现doBegin, doTake, doPut, doCommit, doRollback, doClose等方法。

    因此BasicChannelSemantic类和BasicTransactionSemantics类一起保证了操作Channel的逻,。提供了所有Channel的父类。事务中的各个操作的语义,则由BasicTransactionSemantics的子类去实现,即它的子类来说明事务开始时干嘛,事务回滚时干嘛,取出消息时干嘛、放入消息时干嘛等等。(可以类比下模版方法模式,不过这里父类通过特殊的手段强制了方法的调用顺序)

  • 相关阅读:
    fullCalendar改造计划之带农历节气节假日的万年历(转)
    Linked List Cycle
    Remove Nth Node From End of List
    Binary Tree Inorder Traversal
    Unique Binary Search Trees
    Binary Tree Level Order Traversal
    Binary Tree Level Order Traversal II
    Plus One
    Remove Duplicates from Sorted List
    Merge Two Sorted Lists
  • 原文地址:https://www.cnblogs.com/devos/p/3439122.html
Copyright © 2011-2022 走看看