Spring Statemachine 1.0.0.RC1 发布

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

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

此版本的重点是使核心框架更加稳定,并最终为分布式状态机添加 jepsen 测试。 我们还添加了第一个版本的测试支持。 从 RC1 问题中可以找到已解决的 github 问题。 我们相对接近发布版本,这意味着如果没有出现重大问题,下一个版本将是 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 测试

我们对使用 Zookeeker 的分布式状态的支持被证明在使用一组常规单元测试进行测试时相对困难,因此我们在测试覆盖率方面遇到了瓶颈。 我想借此机会谈谈如何使用 jepsen 测试分布式系统。

Kyle Kingsbury(又名 @aphyr)的 Jepsen 测试框架是一个可用于测试分布式系统的系统,它具有同步发送到节点中的事件并导致网络上的脑裂等功能。 Jepsen 将成为我们系统的核心,以确保我们的分布式支持能够完成它应该做的事情。 这是一个测试由 Zookeeper 支持的 Spring 分布式状态机的头等系统。

这将有一篇单独的博文,但初步结果可以在我们的参考文档 分布式状态机技术论文 中找到。 请关注该博客文章!

在这里,我们从我们的 jepsen 测试中窥探一下,展示了当集群遭受分裂导致 zookeeper 集群完全崩溃时会发生什么,以及当网络中断并恢复时会发生什么。

Zookeeper Sample

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

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

#SpringOne 2GX 2015 即将到来!

华盛顿特区的 SpringOne2GX 上尽快预订您的位置。 这绝对是第一手了解所有情况并提供直接反馈的最佳机会。

获取 Spring 时事通讯

通过 Spring 时事通讯保持联系

订阅

抢占先机

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

了解更多

获得支持

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

了解更多

即将举行的活动

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

查看全部