Spring Statemachine 1.0.0.RC1 发布

发布 | Janne Valkealahti | 2015年9月1日 | ...

我们很高兴地宣布 Spring Statemachine 1.0.0.RC1 的第一个候选版本发布。

此版本的重点是使核心框架更加稳定,并最终为分布式状态机添加 Jepsen 测试。我们还添加了测试支持的第一个版本。已解决的 GitHub 问题可以从 RC1 问题 中找到。我们离发布正式版本已经很近了,这意味着如果没有任何重大问题出现,下一个版本将是 1.0.0.RELEASE。如果出现紧急情况,我们将在发布之前发布 1.0.0.RC2

既然我们已经到了这里,让我们深入了解一下此版本中的新功能。

除了通常的错误修复之外,以下列出了主要的新功能

  • 测试支持
  • 分布式状态机的 Jepsen 测试

## 测试支持 测试状态机并非易事,因此我们引入了新的 spring-statemachine-test 模块,该模块将简化 Spring Statemachine 单元测试的过程。由于依赖关系,它没有用于核心系统,但对于 recipesZookeeper 集成来说,它已经被用于测试这些模块。

在测试中测试一个简单的状态机将看起来很简单,就像

StateMachine<String, String> machine = buildMachine();
StateMachineTestPlan<String, String> plan =
  StateMachineTestPlanBuilder.<String, String>builder()
    .defaultAwaitTime(2)
    .stateMachine(machine)
    .step()
      .expectStates("SI")
      .and()
    .step()
      .sendEvent("E1")
      .expectStateChanged(1)
      .expectStates("S1")
      .and()
    .build();
plan.test();

如果定义了一个状态机

StateMachine<String, String> buildMachine()
    throws Exception {
  StateMachineBuilder.Builder<String, String> builder =
    StateMachineBuilder.builder();

  builder.configureConfiguration()
    .withConfiguration()
      .taskExecutor(new SyncTaskExecutor())
      .autoStartup(true);

  builder.configureStates()
    .withStates()
      .initial("SI")
      .state("S1");

  builder.configureTransitions()
    .withExternal()
      .source("SI").target("S1")
      .event("E1");

   return builder.build();
}

## Jepsen 测试

我们对使用 Zookeeper 的分布式状态的支持证明测试起来相对困难,因此我们在测试覆盖率方面遇到了瓶颈。我想借此机会谈谈使用 Jepsen 测试分布式系统。

Jepsen 是 Kyle Kingsbury(又名 @aphyr)开发的测试框架,可用于测试分布式系统,并具有同步发送到节点的事件以及导致网络发生脑裂等功能。Jepsen 将成为我们系统核心的组成部分,以确保我们的分布式支持能够按预期工作。这是测试由 Zookeeper 支持的 Spring 分布式 Statemachine 的一流系统。

我们将对此进行单独的博文介绍,但初步结果可以在我们的参考文档 分布式状态机技术论文 中找到。敬请期待那篇博文!

在这里,我们从 Jepsen 测试中窥探一下,看看当集群发生网络分割导致 Zookeeper 集群完全中断时会发生什么,以及当网络中断并恢复时会发生什么。

Zookeeper Sample

在上图中,我们有一个 5 节点的集群,共享由 Zookeeper 集群支持的相同状态机配置,其中每个节点连接到其自己的本地实例。首先,事件 C 发送到所有机器(只有一个将处理分布式状态更改),这将启动从状态 S21S211 的分布式转换。然后网络中断,图表显示了每台机器最终将如何进入错误状态。当网络和 Zookeeper 集群稍后恢复时,所有机器将重新加入集群并同步其状态。最后,事件 K 再次发送到所有机器,以显示所有机器在网络问题解决后都能正常工作。

如我们的文档中所述,如果现有的 Zookeeper 领导者被保留在少数派中,所有实例都将与集群断开连接,从而导致所有状态机进入错误状态。这种情况稍后将在网络恢复并且 Zookeeper 集群自行修复后自动解决,并连接到它的状态机可以重置其自身状态。

## SpringOne 2GX 2015 即将到来!

尽快在 华盛顿特区的 SpringOne2GX 上预订您的席位。这是了解所有最新动态并提供直接反馈的最佳机会。

获取 Spring 电子邮件

通过 Spring 电子邮件保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获得支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部