任何人都知道提供对一致性保证的精细控制的消息总线实现?Full ACID 太慢,没有 ACID 太错误。
我们目前正在使用 Rhino ESB 包装 MSMQ 进行消息传递。当对分布式事务使用持久的事务性消息传递时,MSMQ 可以在等待 I/O 完成时阻塞提交相当长的时间。
我们的消息分为两大类:业务逻辑和非规范化。后者占消息总线流量的很大比例。
业务逻辑消息需要完整的 ACID 保证,MSMQ 已证明足以满足此要求。
非规范化消息:
- 必须耐用。
- 在原始事务完成之前不得处理。
- 可以多次处理。
- 即使原始事务回滚,也可以处理,只要遵守 2)。
(在某些特定情况下,可能会放宽对持久性的要求,但将这些情况作为规则的例外来识别和处理会增加复杂性。)
所有非规范化消息都在进程中处理,因此不需要 IPC。
如果重新启动该过程,则可以假定所有事务都已完成(已提交或回滚),并且必须恢复所有尚未处理的非规范化消息。重播已经处理的非规范化消息是可以接受的。
据我所知,处理事务的消息传递系统倾向于在完整的 ACID 或没有之间提供选择,而 ACID 会带来性能损失。我们看到在某些情况下调用 TransactionScope#Commit() 需要几百毫秒,具体取决于发送的消息数量。
使用非事务性消息队列会导致消息在其原始事务完成之前被处理,从而导致一致性问题。
我们系统的另一部分具有相似的一致性要求但复杂性较低,它已经在使用类似于事务日志的自定义实现,并且对于这个用例进行概括肯定是一种选择,但我宁愿不实现低延迟,并发,持久,事务性消息传递系统,如果我不需要的话:P
如果有人想知道,需要非规范化消息的持久性的原因是检测不同步和修复不同步可能分别非常困难和极其昂贵。人们确实会注意到什么时候出现了轻微的错误并且页面刷新并不能解决它,所以忽略不同步不是一种选择。