问题描述
好的,Stack Overflow社区。 p>
我对正在使用的软件体系结构有一些疑问,我将为他们提供帮助。
该应用的组件如下:
- 模型项目(网络核心类库)。在这里,我定义了模型类和数据库上下文。
- 业务项目(网络核心类库)。它对模型程序集具有参考,并实现了业务逻辑。同样在这里,放置了一个HostedService,其中包含用于通过EasyNetQ使用Send / Receive和Request / Response模式与微服务一起工作的代码。
- Web API项目(Net Core Web API应用程序)。它使用Business Assembly并提供Web api功能。此应用托管在iis 10上。
- Web前端项目(网络核心剃刀Web应用程序)。它还使用业务程序集并提供Web UI功能。此应用托管在iis 10上。
- 某些微服务应用程序,可以通过接收和发送消息通过EasyNetQ与Business Assembly通信。每个微服务都在一个实例中运行。
Web api应用程序和Web前端应用程序同时工作。因此,我们有两个业务逻辑程序集实例同时工作,并且它们都在相同的Rabbitmq队列中工作。
因此,恐怕Business Assembly的一个实例可能会向微服务(IBus.Send)发送消息,但是Business Assembly的第二个实例可能会从微服务(IBus.Receive)接收消息。据我了解,在这种情况下可能会发生冲突,因为Business的第一个实例等待答案而没有收到它,而Business的第二个实例同时收到了无法等待的答案。
一些代码。
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
{
...
});
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)