【发布时间】:2015-01-07 19:31:21
【问题描述】:
在 Spring Integration 中,我有一个服务链,如下所示:
message -> A -> B -> C -> D -> ... -> output
这很好用。我想让每个服务都异步并使它们变得悲观。他们每个人都会收到一条消息,对其进行处理并将其发送到链中的下一个服务。但是,它不会等到整个链条完成。它将继续处理下一条消息,依此类推。此处为标准异步。
但是,假设服务 B 比 A 慢,并且它在入站通道队列中累积了 10k 条消息,此时系统崩溃。我希望能够通过找出我离开的位置并重新处理消息来恢复系统。出于这个原因,我希望每个服务都知道它处理的哪些消息被以下服务成功使用。已发送与已处理之间的区别。
我的想法是做类似这样的事情(花哨的 ascii):
-> A --> B -> C -> ...
^ |
| ack |
\-----/
也就是说,A 将发送给 B,B 将进行处理,当它成功完成后,它会向 A 发送一个 ack。然后 A 将从存储中删除该特定消息,以便下次运行时,它会不重新处理它。我想我会在 B 之后放置一个拆分器,它会在服务 A 上调用不同的方法(即ackProcessed)。
这是应该在 SI 中完成的方式,还是我缺少另一种方式?我主要是要求确认我没有遗漏开箱即用支持的内容或不会强迫我在每个服务之后创建拆分器的内容。
【问题讨论】: