我已将Starbucks示例转换为使用RabbitMQ和NHibernate。但是,DrinkPreparationSaga存在一个错误/挑战/问题,当它实际保存到数据库时,与提交PaymentCompleteMessage时相比。
代码是如何工作的(开箱即用,这不是我改变的任何内容)...在初始状态完成后它转换到下一个状态之前,saga的新实例不会保存到数据库中
问题是,在星巴克的应用程序中,DrinkPreparationSaga以一种非常慢的方法开始,每隔1秒就会打印出一次咖啡制作声音10次。
因此,实际创建Saga和将其保存到数据库之间有10秒的时间。更大的问题是,任何其他发往saga实例的消息(通过CorrolationId)都会被抛出在错误队列中,因为Saga不存在。
NHibernateSagaRepository不应该立即保存新的Saga实例,然后运行工作流程,然后更新saga post工作流程吗?我似乎无法想到另一种使示例工作的方法,但这需要在NHibernateSagaRepository中进行大量的重组。
提前致谢。
答案 0 :(得分:0)
在处理消息之前未保存sagas的原因是saga的某些成员可能不可为空(或允许空值)并且在处理初始saga消息之前未设置它们。
你是对的。查看Riktig样本(http://github.com/phatboyg/Riktig),了解如何使用Automatonymous sagas以及如何使用其他服务(在本例中为图像检索服务)的相关性。 Sagas实际上不应该执行工作,而是协调事务的状态。早期的星巴克例子是我们在奥斯汀一天早上建立的一个天真的实施。更新已经过期了(出于更多原因,包括它仍然使用Magnum状态机,很快就弃用了Automatonymous)。