在同一应用程序的两个或多个实例中使用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 (将#修改为@)