jolie - 使用 Jolie 存储工作流状态
问题描述
我试图了解 Jolie 如何实现工作流程的弹性。
- Jolie 是否存储运行工作流的状态?
- 它是通过使用数据库还是文件系统来实现的?
解决方案
您可以混合使用 Jolie 语言的三个组件来保存/加载工作流状态和程序故障恢复代码:
- Jolie 变量,它们是树;
- 一些支持 Jolie 树的编组和解组以及文件/数据库交互的标准库;
- 用于处理异常行为的语言错误处理机制。
Jolie 微服务实例的状态是一棵树(类似于 XML 和 JSON 结构)。在实践中,虽然 Joliea = 5
回忆起在其他语言中发现的熟悉的变量赋值,但实际发生的是,在实例执行赋值的状态下,我们创建一个节点a
并赋值给a
value 5
。反之亦然,当我们编写a
Jolie 程序时,我们正在访问存储在节点下的值a
。同样,意味着在下a.b = 6
创建一个子节点并为其分配 value 。b
a
6
在发送和接收结构化数据时,语言中的原生树数据结构非常有用,因为 Jolie 自动将其树形变量转换为用于通过其端口与某些外部客户端/服务器通信的格式。但是,树形变量也很容易编组/解组。例如,我们可以通过调用JSON (或 XML)库来转换 Jolie 树变量的当前状态,并使用文件或数据库库进行持久化。
我在下面组装了一个简单的例子来说明我的观点。在示例中,我使用过程saveState
并loadState
保存和加载存储在 variable 下的值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 还提供了一些高级构造来处理工作流的终止和补偿,这对于避免保存损坏的阶段和强制执行事务行为很有用。
参考
- 法布里齐奥·蒙特西、克劳迪奥·圭迪和詹路易吉·扎瓦塔罗。(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
推荐阅读
- android - 模拟器:尝试在 eip 处执行 vcpu:8d684f
- laravel - 验证通过后验证自定义规则
- ruby-on-rails - S3 存储桶正在输出奇怪的空白链接
- ios - Swift:错误->在初始化之前使用了变量“str”
- javascript - 关于丢帧和 requestAnimationFrame 的困惑
- javascript - 在两个重叠的元素中捕获两个事件
- php - 基于数据库数据 PHP 和 mysql 的 span 类
- c++ - c++ 中的 std::cout 流究竟是如何工作的?
- c++ - Ranges-v3 组合在使用 range::views::counted(1) 时产生错误
- python - 运行 WSGI 应用程序时出错 | ModuleNotFoundError:pythonanywhere.com 中没有名为“flask”的模块