好时光,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
{
...
});