执行操作和回滚的框架

actionqueues的Python项目详细描述


操作队列

actionqueues是一种轻量级的方法,用于将命令排队以执行和 失败时回滚。

其思想是它提供了一个安全的框架 执行具有副作用的操作序列,如数据库写入 如果以后的操作失败,可能需要稍后回滚。此外,它还提供 重试操作的标准方法。

例如,用户注册过程可以写入多个不同的系统。 如果一个系统坏了,那么到目前为止修改过的其他系统需要清洗 在故障传播回用户之前。使用actionqueues 对每个要修改的外部系统执行一个操作将启用此模式, 以及简单的重试语义,用于可能的暂时性故障,如网络 Burs.

安装

pip install actionqueues

使用操作队列

这是赤裸裸的,重点是提供一个框架 有副作用的行为。基本上是命令模式 微型执行框架。

操作是最低级别的构建块。它是任何带有execute的对象 以及回滚方法。操作是处理执行 整个工作流,并回滚对外部状态所做的任何更改。它是 一个对象,以便它可以保存状态以进行回滚—例如,primary 任何已创建数据库行的键,以便在回滚期间将其删除。

actionqueues用户的主要任务是创建操作类 实现其工作流程所需的任务。

一旦编写了action类,就可以执行它们。actionqueue保存执行和回滚的actions。将操作对象添加到操作队列 执行死刑。调用actionqueue execute开始运行每个操作的 按将操作对象添加到 操作队列。此点之后的行为由execute回滚队列正在执行的对象上的方法。

正常操作

默认情况是在执行过程中不会引发异常,并且 队列中的下一个操作是调用了execute。下面显示的是 操作队列中对象的操作序列

Happy path

回滚期间出现异常

与从execute引发的异常相反,如果引发异常 在rollback方法中,actionqueue将 静默地接受异常并继续执行rollback方法 队列中较早的操作对象。

这是因为,在回滚场景中,最有可能的是 操作应该会发生,所以库会假定这一点。因此回滚方法 在重新引发异常之前,应自行记录异常。

回滚异常了解一些 涵盖常见情况的帮助类。

示例

importrandomfromactionqueuesimportactionqueue,actionSUCCEED=0RETRY=1FAIL=2classMyAction(action.Action):def__init__(self,id):self._id=idself._value=0defexecute(self):"""Called if actions before it in the queue complete successfully.        Raise any exception to indicate failure.        """action=random.choice([SUCCEED,RETRY,FAIL])ifaction==RETRY:printself._id,"Throwing retry exception"raiseactionqueue.ActionRetryException(ms_backoff=0)elifaction==FAIL:printself._id,"Throwing failure exception"raiseException()else:printself._id,"Executing success action"self._value=1defrollback(self):"""Called in reverse order for all actions queued whose execute        method was called when the ActionQueue's rollback method is called.        """printself._id,"Rolling back action"ifself._value==1:self._value=0q=actionqueue.ActionQueue()q.add(MyAction("a"))q.add(MyAction("b"))try:q.execute()except:q.rollback()

重试异常帮助程序

跟踪回退和操作的重试计数可能会很乏味。 因此,actionqueues为这个异常工厂提供帮助。 当初始化操作时,当执行时 方法遇到可重试的异常,它调用工厂的raise\u exception() 方法。通常,这会引发 给定重试次数,然后引发泛型异常,或由 操作对象。

executerollback使用单独的exceptionfactory对象通常是 必需。

可用的异常工厂是:

  • doublingbackoffexceptionfactory它将抛出一个可配置的数字 actionRetryException异常,每个异常的回退时间都是原来的两倍。

在本例中,ZeroDivision错误将导致5次重试,在100200, 通过使用DoublingBackOffExceptionFactory

fromactionqueuesimportactionqueue,actionfromactionqueues.exceptionfactoryimportDoublingBackoffExceptionFactoryclassMyFailingAction(action.Action):def__init__(self):self._run=1self._execute_ex_factory=DoublingBackoffExceptionFactory(retries=5,ms_backoff_initial=100)self._rollback_ex_factory=DoublingBackoffExceptionFactory(retries=10,ms_backoff_initial=100)defexecute(self):"""Execute an always failing action, but have it retried 5 times."""print"Executing action",self._runself._run+=1try:1/0exceptZeroDivisionError,ex:self._execute_ex_factory.raise_exception(original_exception=ex)defrollback(self):print"Rollback action",self._runself._run+=1try:1/0exceptZeroDivisionError,ex:self._rollback_ex_factory.raise_exception(original_exception=ex)q=actionqueue.ActionQueue()q.add(MyFailingAction())try:q.execute()except:print"boom"

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
由于测试失败,java testcontainers maven构建失败   java实现jacobi算法实现laplace方程   java中的多线程:如何在不等待所有线程使用ExecutorService完成任务的情况下终止所有线程的执行?   java Hello World不在Android Studio 3中工作   ubuntu Tomcat7的Java版本不正确   java Javafx内存泄漏   对于手动实现的Spring数据存储库方法,我应该使用Java8默认方法吗?   googleappengine中的java添加过滤查询   html当使用JSOUP库在Java中读取标签时,如何保留标签(如<br>、<ul>、<li>、<p>等)的含义?   编码为什么jasper生成的报告在Java中不显示西里尔语(保加利亚语)?   java有没有办法隐藏当前位置和jdk动作?   java找出编译原型文件的版本   有没有办法在运行时更改java方法的访问修饰符?   语法字符串。。。Java中的参数   java数组元素在添加其他元素时会相互覆盖   eclipse中的java GWT项目   java如何为spring rest模板请求将动态json属性名映射到jackson   java无法在Windows 10上找到特定的JDK   在xml字符串和java字符串之间提取正则表达式子字符串