首页 > 解决方案 > 使用 Jolie 存储工作流状态

问题描述

我试图了解 Jolie 如何实现工作流程的弹性。

标签: jolie

解决方案


您可以混合使用 Jolie 语言的三个组件来保存/加载工作流状态和程序故障恢复代码:

  • Jolie 变量,它们是树;
  • 一些支持 Jolie 树的编组和解组以及文件/数据库交互的标准库;
  • 用于处理异常行为的语言错误处理机制。

Jolie 微服务实例的状态是一棵树(类似于 XML 和 JSON 结构)。在实践中,虽然 Joliea = 5回忆起在其他语言中发现的熟悉的变量赋值,但实际发生的是,在实例执行赋值的状态下,我们创建一个节点a并赋值给avalue 5。反之亦然,当我们编写aJolie 程序时,我们正在访问存储在节点下的值a。同样,意味着在下a.b = 6创建一个子节点并为其分配 value 。ba6

在发送和接收结构化数据时,语言中的原生树数据结构非常有用,因为 Jolie 自动将其树形变量转换为用于通过其端口与某些外部客户端/服务器通信的格式。但是,树形变量也很容易编组/解组。例如,我们可以通过调用JSON (或 XML)库来转换 Jolie 树变量的当前状态,并使用文件数据库库进行持久化。

我在下面组装了一个简单的例子来说明我的观点。在示例中,我使用过程saveStateloadState保存和加载存储在 variable 下的值process_state,这是包含工作流中使用的所有相关值的根变量。工作流程从main块开始,我们在其中保存一些数据并打印以供参考(操作valueToPrettyStringprintln)。然后,我们保存当前状态 ( saveState) 并继续stage1。由于变量process_state.c等于"bad"我们抛出一个错误(MyFault)。install块捕获故障并执行recv_stage1过程。该程序丢弃程序以前的错误状态,恢复保存在文件中的状态并“修复”变量process_state.c。完成后,我们stage1再次执行。

include "console.iol"
include "json_utils.iol"
include "string_utils.iol"
include "file.iol"

define saveState
{
  getJsonString@JsonUtils( process_state )( marshalled_state.content );
  writeFile@File( marshalled_state )();
  undef( marshalled_state.content )
}

define loadState {
  undef( process_state );
  readFile@File( marshalled_state )( marshalled_state.content );
  getJsonValue@JsonUtils( marshalled_state.content )( process_state );
  undef( marshalled_state.content )
}

define recv_stage1 {
  scope( recv_stage1 ){
     loadState;
     process_state.c = "fine";
     valueToPrettyString@StringUtils( process_state )( state_pretty_print );
     println@Console( state_pretty_print )()
  }
}

define stage1 {
  scope( stage1 ){
    install( MyFault => 
      println@Console( "MyFault, loading saved state" )(); recv_stage1; stage1 );
    if ( process_state.c == "bad" ){
      throw( MyFault )
    } else {
      println@Console( "Everything went " + process_state.c )()
    }
  }
}

main
{
  marshalled_state.filename = "instance_XXX.json";
  with ( process_state ){
    .a = 42;
    .b << "I" { .love = "very", .much = "jolie" };
    valueToPrettyString@StringUtils( process_state )( state_pretty_print );
    println@Console( state_pretty_print )();
    saveState;
    .c = "bad";
    stage1
  }
}

这种分级也可用于从崩溃中恢复(例如,通过向变量指示最后到达的阶段)。

Jolie 还提供了一些高级构造来处理工作流的终止和补偿,这对于避免保存损坏的阶段和强制执行事务行为很有用。

参考

  • 法布里齐奥·蒙特西、克劳迪奥·圭迪和詹路易吉·扎瓦塔罗。(2014)。Jolie 的面向服务编程。在 A. Bouguettaya、QZ Sheng 和 F. Daniel(编辑),Web 服务基础(第 81-107 页)中。施普林格https://doi.org/10.1007/978-1-4614-7518-7_4
  • Fabrizio Montesi、Claudio Guidi、Ivan Lanese 和 Gianluigi Zavattaro。(2008 年)。面向服务的应用程序的动态故障处理机制。https://doi.org/10.1109/ECOWS.2008.20

推荐阅读