【问题标题】:Using NServiceBus in a synchronous API在同步 API 中使用 NServiceBus
【发布时间】:2021-11-26 14:27:55
【问题描述】:

我将 API 公开给要求 API 同步的供应商。但是,我想在它的后端使用 NServiceBus 来充分利用我们的其他架构。
是否有可用于支持此流程的产品/框架? 在选择这种方法时有什么想法/考虑吗?

API 如上所述是同步的,我们将对请求进行一些转换,然后将其放在 NServiceBus 队列中以供其他系统进一步处理。
消息发送到队列后,我们应该等待其他系统完成其操作,并在收到回复消息时再次唤醒。

伪代码:

void APICall(String someMessage) {
    var msgBusMessage = new { json = someMessage, ID = Guid.NewID() };
    NServiceBus.EnqueueMessage(msgBusMessage);
    var returnMessage = NServiceBus.WaitForReplyMessageWithID(msgBusMessage.ID);

    return returnMessage;
}

【问题讨论】:

  • 您能否详细解释一下 API 和 NServiceBus 将如何交互?您是否通过同步 API 接收请求并提供响应?您是否计划接收 NServiceBus 事件并将它们传递回同步连接的 API?您是否考虑过同步技术选择?如果您能提供更多关于您想要实现的目标的详细信息,我或许可以提供帮助。

标签: nservicebus


【解决方案1】:

NServiceBus 有一个名为 Callbacks 的功能,旨在处理这种类型的交互。它的工作原理几乎与您提供的 sn-p 完全相同。您通过 NServiceBus 发送一个请求,然后获得一个最终将包含响应的任务。您可以等待该任务并将结果返回给同步 API。

设置:

  1. 添加对NServiceBus.Callbacks 包的引用(在发送方和接收方端点中)
  2. 通过调用endpointConfiguration.EnableCallbacks() 启用回调。如果端点返回回复但不请求请求同步回调,那么您应该使用endpointConfiguration.EnableCallbacks(makesRequests: false)
  3. 任何发出回调请求的端点都应该是唯一可寻址的endpointConfiguration.MakeInstanceUniquelyAddressable(someUniqueIdThatSurvivesRestarts)。这允许将响应消息路由到正在等待它的特定端点实例。
  4. 在调用者中,使用以下var response = await endpoint.Request<ResponseMessage>(new RequestMessage { ... })
  5. 在接收器中为RequestMessage 创建一个处理程序并返回context.Reply(new ResponseMessage {...})

您可以在the documentation 中阅读有关此功能的更多信息(包括关于何时应该使用和不应该使用它的一些警告)。还有a sample 显示正在使用的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多