【发布时间】:2015-04-28 22:19:07
【问题描述】:
免责声明:我真的才刚刚开始接触 SOA,所以您必须原谅我的无知。
我有一个非常简单的服务,可以处理来自 3rd 方 API(salesforce)的应用程序。 UI 接受 ID -> 发送 ProcessCmd 并启动 saga -> saga 从 API 导入数据 -> saga 订阅 ImportedEvt 并尝试验证 -> saga 无限期地运行检查新信息或手动覆盖 -> 如果 saga 结束,则发布带有状态的 ProcessedEvt。
现在我的 UI 是基于 Angular/SignalR 的两个页面。
Index.html 在提交时填充了 ID 和空字段(通过 JS)并监听这两个事件。 ImportedEvt 填充一些字段,ProcessedEvt 填充状态字段(接受/拒绝等)。它还会激活指向详细信息的链接。
Details.html 只是查询数据库。
最初我将数据保存在 ProcessingSaga 中,但我在 David Boike 的 book 中读到,这是不好的做法,因为 saga 是船长,只发出命令但没有实际的操舵。所以我在我的服务上添加了另一个 ProcessedEvtHandler 以保存到数据库,但我不知道这是否正确。
有几件事让我感到困惑:
- 我记得 Udi 曾经说过,两个服务不应通过共享相同的数据而相互依赖。但我也明白 NServiceBus 不是为同步查询而设计的。因此,我必须在我的 UI 和我的服务之间在逻辑上共享相同的数据库。我可以理解仅 UI 查询是可以的,但就我而言,为了用户体验,我还想保存到数据库。
- 因为我将数据库逻辑与我的 saga 分开,就像我被推荐的那样,我的事件失去了它们的自然顺序。我的 UI 很可能击败了 DB 调用,并且 details.html 暂时为空。我的两个事件 ImportedEvt 和 ProcessedEvt 反映了我的业务模型似乎是合乎逻辑的。在我看来,这些是唯一事件也是合乎逻辑的。为什么我应该纯粹为了 UI 而创建一个新事件 SavedToDbEvt?
在我看来,尽管我的 UI 有它自己的端点并且能够像任何其他服务一样发送/接收消息。它并不真正属于同一类别。拥有最终一致性对于幕后业务规则非常有用,但会产生糟糕的用户体验,我不明白我为什么不能让 UI 服务共享数据库?
我错过了什么吗?
【问题讨论】:
标签: nservicebus soa