NServiceBus Sagas和REST API集成的最佳实践

时间:2012-09-09 00:51:47

标签: api architecture nservicebus

将NServiceBus Sagas与REST API集成/交互的最明智的方法是什么?

方案如下,

  • 我们有一个负载均衡的REST API。根据负载,我们可以添加更多节点。
  • REST API是DomainServices API的包装器。这意味着可以直接使用API​​。
  • 我们希望将Sagas用于工作流程并实施NServiceBus分销商以进行横向扩展。

问题是,如果我们使用Sagas的REST API,实际处理将在API场中进行。这在某种程度上违背了实施经销商模式的目的。

另一方面,直接从Sagas使用DomainServives API,允许在工作节点内本地进行处理。使用这种方法,我们必须在多个位置维护API程序集,但吞吐量可能更高。

我想了解最好的方法。就个人而言,我更喜欢使用API​​(如果可以的话),但这可能会给系统带来麻烦,并且与处理过程相比可能需要更长的时间才能完成。

典型的序列可能类似于发布在线广告,

  • 广告商通过网络应用程序提交新的广告请求。
  • Web应用程序调用相关的API端点并发送命令 信息。
  • 命令消息启动新的发布广告Saga 实例。
  • Saga发送命令以验证来电者权限(in 进程/进程外API调用)
  • Saga发送命令验证 广告数据(进程/进程外API调用)
  • 佐贺送了一个 命令欺诈服务(第三方服务)
  • 内容和欺诈验证成功后,
  • Saga向计费系统发送命令。
  • Saga调用API调用来保存添加详细信息。 (在 进程/进程外API调用)

这一直持续到广告过期,有许多重试和失败条件路径。

2 个答案:

答案 0 :(得分:2)

经过多次设计迭代后,我们提出了以下指南,

  1. 将REST API层视为集成平台。
  2. 假设API端点能够抽象出相当复杂的微工作流。微工作流是在单个突发(不可中断)中执行的操作,并在短时间内(<1秒)内完成。
  3. 假设API服务器场能够提供许多并发请求,并且可以轻松扩展。
  4. 当目标操作相当简单时,支持基于异步消息的调用的同步调用。
  5. 当需要异步处理时,使用单个消息处理程序并从处理程序调用API。这会将工作委托给API场。这也将消除对分销商和额外硬件资源的需求。
  6. 除非业务工作流包含多个事务,补偿逻辑和简历,否则请避免使用Saga。测试显示Sagas在负载下表现不佳。
  7. 避免直接从消息处理程序中使用DomainServices。这直到在本地完成工作,并通过分发业务逻辑引入部署麻烦。
  8. 很高兴听到想法。

答案 1 :(得分:0)

您确定需要Sagas来管理工作流程。我愿意打赌你的域连接到一个公共数据库。如果确实如此,那么直接使用域并删除序列化/网络开销会更快。您还将失去在数据库级别轻松管理事务的能力。

假设您直接呼叫您的域,性能将成为域执行方式的问题。您可以采取措施优化数据库,降低分布式事务成本,分割数据等。您最终可能会使用分发服务器来拥有多个Saga处理节点,但听起来您在设计完成后还需要进行一些测试。选择的。

一般来说,我们使用REST API将命令建模为资源(通过POST),以允许从无法直接访问消息传递的客户端与NSB进行交互。这是从您的Web应用程序获取NSB的潜在解决方案。