执行操作和回滚的框架

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第三方库


热门话题
带有嵌套JAR的java RCP ClassNotFoundException   java在输入框中设置默认值,crud应用程序使用spring   java如何在Heroku中使用fs创建新文件   java将JPanel放在JFrame中   java这个正则表达式会匹配“i.imgur.com/xxx”吗?   java在片段内创建RecylerView,而无需在Android中设置片段   Android上Groovy导致java错误的双精度浮点精度损失   swing Java查找JFrame属于JPanel的内容   java Spring junit自连线自定义类本身必须有构造函数吗?   java textswitcher支持前面的文本   从Android客户端到JAXRS的java Post自定义对象   java如何检索JSON数据并使用MPAndroidChart绘制折线图,以及在安卓上的改进   拒绝用户“root”@“localhost”的java c3p0访问(使用密码“是”)   使用Selenium Webdriver自动化ExtJS应用程序时java面临的问题