我试图了解Jolie如何实现工作流程的弹性。
答案 0 :(得分:2)
您可以混合使用Jolie语言的三个组成部分来保存/加载工作流的状态和程序故障恢复代码:
Jolie微服务实例的状态是一棵树(类似于XML和JSON结构)。实际上,在Jolie a = 5
回忆起其他语言中熟悉的变量赋值的同时,实际上发生的是,在执行赋值实例的状态下,我们创建了一个节点a
并赋给{ {1}}值a
。反之亦然,当我们在Jolie程序中写入5
时,我们正在访问存储在节点a
下的值。同样,a
意味着在a.b = 6
下创建一个子节点b
并为其分配值a
。
在发送和接收结构化数据时,具有该语言的本机树数据结构非常有用,因为Jolie会自动将其树形变量转换为通过其端口与某些外部客户端/服务器通信的格式。但是,树形变量也相当容易编组/解组。例如,我们可以通过调用JSON(或XML)库并将File或Database库用于持久性来转换Jolie树变量的当前状态。
我在下面的一个简单示例中进行了阐述,以阐明我的观点。在示例中,我使用过程6
和saveState
保存并加载存储在变量loadState
下的值,变量process_state
是包含工作流中所有相关值的根变量。工作流程从main
块开始,我们在其中保存一些数据并打印以供参考(操作valueToPrettyString
和println
)。然后,我们保存当前状态(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还提供了一些高级结构来处理工作流的termination and compensation,有助于避免保存损坏的阶段并强制执行交易行为。
参考