0

好时光,Stack Overflow 社区。

我对我正在研究的软件架构有一些疑问,我将不胜感激。

该应用程序的组件如下:

  • 模型项目(网络核心类库)。在这里,我定义了模型类和数据库上下文。
  • 业务项目(网络核心类库)。它参考了模型组件并实现了业务逻辑。同样在这里,放置了一个托管服务,其中包含用于通过 EasyNetQ 使用发送/接收和请求/响应模式处理微服务的代码。
  • Web API 项目(net core web api app)。它使用业务程序集并提供 Web api 功能。这个应用程序托管在 iis 10 上。
  • Web 前端项目(net core razor web 应用程序)。它还使用业务程序集并提供 Web UI 功能。这个应用程序托管在 iis 10 上。
  • 一些微服务应用程序,可以通过 EasyNetQ 通过接收和发送消息与业务组件进行通信。每个微服务都在一个实例中运行。

Web api 应用程序和 Web 前端应用程序同时工作。因此,我们有两个业务逻辑组装实例同时工作,并且它们都使用相同的 rabbitmq 队列。

所以,恐怕业务程序集的一个实例可能会向微服务(IBus.Send)发送消息,但业务程序集的第二个实例可能会从微服务(IBus.Receive)接收消息。在这种情况下,据我了解,可能是冲突,因为业务的第一个实例等待答案并且没有收到它,同时业务的第二个实例收到不可等待的答案。

一点代码。

Web api 应用启动:

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddBusiness(Configuration);
    ...
}

Web 前端应用启动:

public void ConfigureServices(IServiceCollection services)
{
    services.AddBusiness(Configuration);
    ...
}

业务逻辑组装启动:

public static IServiceCollection AddBusiness(this IServiceCollection services, IConfiguration configuration)
{
    ...
    services.AddSingleton(sp =>
    {
        var rabbitMqSettings = sp.GetRequiredService<IOptions<RabbitMqSettings>>();
        return RabbitHutch.CreateBus(rabbitMqSettings.Value.Connection);
    });

    services.AddHostedService<RabbitMessagesReceiverService>();

    return services;
}

业务逻辑组装 EasyNetQ 代码示例:

public class RabbitMessagesReceiverService : BackgroundService
{
    readonly IBus _bus;

    public RabbitMessagesReceiverService(IBus bus)
    {
        _bus = bus;
    }

    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        // receives messages from microservice
        _bus.Receive<OutgoingResult>(RabbitHelper.OUTGOING_RESPONSE, async response =>
        {
            ...
        }
    }
}

或者

    // sends message to microservice
    await _bus.SendAsync<OutgoingRequest>(RabbitHelper.OUTGOING_REQUEST, new OutgoingRequest
    {
        ...
    });
4

0 回答 0