使用 NServiceBus 和 REST 的应用架构 API
App architecture with NServiceBus and REST API
我们正在努力替代使用 SQL 后端的旧 VB6 系统。大多数业务逻辑都在存储过程和触发器中。我们目前有一些 NServiceBus 功能,通过使用数据库中的触发器将消息放入队列 (SQLTransport)。
我想构建一个新的干净的 api,它在幕后使用所有相同的表和存储过程。一旦所有应用程序和服务都在使用新的 api 和消息系统,我们就可以开始清理后端了。
新前端将调用 REST api 来检索数据。我正在努力解决的问题是执行 create/update/delete 数据操作的最佳实践。对于不需要立即响应的自动化流程,他们可以通过总线发送命令。但是,对于将要使用该应用程序的最终用户而言,他们期望立竿见影的效果。如果某事导致消息转到 FLR/SLR,客户坐在那里期待发生某些事情显然是不可接受的。
一个想法是拥有一个库来处理对数据库的所有调用,API 和任何 NServiceBus 消息处理程序都可以使用它。我看到的问题是操作何时需要发布事件。从消息处理程序中,可以简单地发布消息。如果我正在处理来自 REST api 的简单命令,我不能只发布相同的事件(因为没有任何内容订阅 REST api,它可能是。
一种解决方案是让 REST api 向端点(其他端点已订阅的端点)发送(而不是发布)消息,然后将事件发布给所有订阅者.
其他人是如何实现这样的功能的?我想到的主要用例是简单的 create/update/delete 客户端期望实时结果的操作,但后端可能需要发布一个事件来指示发生了什么。
您所描述的是一个挑战,我不会尝试在这里提供解决方案,但是,有几点建议...
同步通信(request/response 在同一频道上)与消息传递正交,消息传递通信方式是即发即弃。
CQS (Command Query Separation) 状态更改操作不回复已更改状态的数据,因此读取操作在单独的通道上完成的概念是使用消息传递构建系统的良好指南。
此外,我会避免使用消息传递进行读取操作(使用直接 ADO)。
CRUD 操作有异味(我知道这是遗留代码库),因为这些操作隐藏了任何意图或商业价值。
您最终得到的解决方案可能是消息传递和同步通信的混合(我假设您此时不打算从头开始重写)
我很乐意进行更深入的讨论(给我发电子邮件 sean.farmar particular.net)
我们正在努力替代使用 SQL 后端的旧 VB6 系统。大多数业务逻辑都在存储过程和触发器中。我们目前有一些 NServiceBus 功能,通过使用数据库中的触发器将消息放入队列 (SQLTransport)。
我想构建一个新的干净的 api,它在幕后使用所有相同的表和存储过程。一旦所有应用程序和服务都在使用新的 api 和消息系统,我们就可以开始清理后端了。
新前端将调用 REST api 来检索数据。我正在努力解决的问题是执行 create/update/delete 数据操作的最佳实践。对于不需要立即响应的自动化流程,他们可以通过总线发送命令。但是,对于将要使用该应用程序的最终用户而言,他们期望立竿见影的效果。如果某事导致消息转到 FLR/SLR,客户坐在那里期待发生某些事情显然是不可接受的。
一个想法是拥有一个库来处理对数据库的所有调用,API 和任何 NServiceBus 消息处理程序都可以使用它。我看到的问题是操作何时需要发布事件。从消息处理程序中,可以简单地发布消息。如果我正在处理来自 REST api 的简单命令,我不能只发布相同的事件(因为没有任何内容订阅 REST api,它可能是。
一种解决方案是让 REST api 向端点(其他端点已订阅的端点)发送(而不是发布)消息,然后将事件发布给所有订阅者.
其他人是如何实现这样的功能的?我想到的主要用例是简单的 create/update/delete 客户端期望实时结果的操作,但后端可能需要发布一个事件来指示发生了什么。
您所描述的是一个挑战,我不会尝试在这里提供解决方案,但是,有几点建议...
同步通信(request/response 在同一频道上)与消息传递正交,消息传递通信方式是即发即弃。
CQS (Command Query Separation) 状态更改操作不回复已更改状态的数据,因此读取操作在单独的通道上完成的概念是使用消息传递构建系统的良好指南。
此外,我会避免使用消息传递进行读取操作(使用直接 ADO)。
CRUD 操作有异味(我知道这是遗留代码库),因为这些操作隐藏了任何意图或商业价值。
您最终得到的解决方案可能是消息传递和同步通信的混合(我假设您此时不打算从头开始重写)
我很乐意进行更深入的讨论(给我发电子邮件 sean.farmar particular.net)