用于重建事件的可扩展架构

时间:2015-04-09 23:42:45

标签: java architecture jvm replay

我的任务是开发数据转换管道的架构。 本质上,数据在一端进入,并通过各种内部系统路由,获取不同的形式,然后到达目的地。

  

主要目标是 -

     
      
  • 容错。如果其中一个中间系统出现故障,则该消息应该是可恢复的。
  •   
  • 重播/重新排序 - 可以从任何阶段重播该消息,并且应该可以以幂等方式重新创建事件。
  •   

我有一些自定义解决方案可以解决

  • 实施一个检查点系统,可以在每个检查点的入口和出口点记录消息,以便我们知道发生故障的位置。
  • 实现可以转到已记录存储(数据库,日志文件等)的恢复机制,并以编程方式重建事件。

然而,我觉得这是一个相当标准的问题,定义明确的解决方案。

所以,我欢迎任何有关合适架构的想法,任何工具/包/模式等等。

由于

2 个答案:

答案 0 :(得分:1)

Akka是显而易见的选择。当然Scala版本更强大,但即使使用Java绑定,您也可以实现很多功能。

我认为您可以遵循CQRS方法并使用Akka Persistence模块。在这种情况下,很容易重放任何事件序列,因为你总是有一个持久的日记。

通常,Actor Model使用supervision为您提供容错功能。

Akka Clustering将为您提供所需的可扩展性。

将Akka Clustering与Akka Persistence和Cassandra一起使用的非常棒的例子 - https://github.com/boldradius/akka-dddd-template(不幸的是只有Scala)。

答案 1 :(得分:0)

一个常见的解决方案是JMS,其中一个中央组件(JMS代理)保留待处理消息的事务存储。因为它除此之外什么也没做,它可以有很长的正常运行时间(使用故障转移群集可以进一步提高正常运行时间,在这种情况下,您的持久性存储也可能是故障转移群集)。

发送JMS消息可以是事务性的,也可以使用消息。这些事务可以通过XA事务与数据库事务同步,尽可能接近完全一次交付,但是它是相当繁重的机器。

在许多情况下(幂等接收器),至少一次交付就足够了。这可以通过使用同步事务发送消息来完成(即,只有在代理确认收到消息后,发送方才会成功),并且只有在处理完消息后才会消息。