微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在同一应用程序的两个或多个实例中使用RabbitMq时防止碰撞

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