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的子类去实现,即它的子类来说明事务开始时干嘛,事务回滚时干嘛,取出消息时干嘛、放入消息时干嘛等等。(可以类比下模版方法模式,不过这里父类通过特殊的手段强制了方法的调用顺序)

  • 相关阅读:
    Algs4-1.1.17找出以下递归函数的问题
    Algs4-1.1.16给出exR1(6)的返回值
    Algs4-1.1.15编写一个静态方法histogram()
    Algs4-1.1.14实现以2为底的对数
    Algs4-1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)
    Algs4-1.1.12以下代码段会打印出什么结果?
    python将一个列表的元素随机打乱
    python 类似java的三目运算符
    java的三元运算符
    java 的Colections类(Java也有python类似列表的反转、排序等方法)
  • 原文地址:https://www.cnblogs.com/devos/p/3439122.html
Copyright © 2011-2022 走看看