如何解决在同一应用程序的两个或多个实例中使用RabbitMq时防止碰撞
好的,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 举报,一经查实,本站将立刻删除。