我的任务是开发数据转换管道的架构。 本质上,数据在一端进入,并通过各种内部系统路由,获取不同的形式,然后到达目的地。
主要目标是 -
- 容错。如果其中一个中间系统出现故障,则该消息应该是可恢复的。
- 重播/重新排序 - 可以从任何阶段重播该消息,并且应该可以以幂等方式重新创建事件。
我有一些自定义解决方案可以解决
然而,我觉得这是一个相当标准的问题,定义明确的解决方案。
所以,我欢迎任何有关合适架构的想法,任何工具/包/模式等等。
由于
答案 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事务与数据库事务同步,尽可能接近完全一次交付,但是它是相当繁重的机器。
在许多情况下(幂等接收器),至少一次交付就足够了。这可以通过使用同步事务发送消息来完成(即,只有在代理确认收到消息后,发送方才会成功),并且只有在处理完消息后才会消息。