C# MVC-WCF-RabbitMQ-通过消息队列向消费者发送域事件加速还是替代方案?

C# MVC-WCF-RabbitMQ-通过消息队列向消费者发送域事件加速还是替代方案?,c#,event-handling,domain-driven-design,bounded-contexts,easynetq,C#,Event Handling,Domain Driven Design,Bounded Contexts,Easynetq,域驱动设计将事件传递到单独的有界上下文中 MVC中的用户操作应生成一个事件,并将其传递给远程(同一LAN)事件处理程序 我所测试的: MVC:触发并忘记服务调用(异步)-> (IIS托管)收集数据并填充消息的WCF-> 通过EasyNetQ/RabbitMQ服务总线发送-> 事件由处理事件及其数据的订阅者(使用从WCF服务端点初始化的DI容器)使用 我做了一些测试,看看如果在MVC端通过循环相当快地调用服务,它是如何工作的 for (int i = 0; i < 200; i++) {

域驱动设计将事件传递到单独的有界上下文中


MVC中的用户操作应生成一个事件,并将其传递给远程(同一LAN)事件处理程序

我所测试的:

  • MVC:触发并忘记服务调用(异步)->
  • (IIS托管)收集数据并填充消息的WCF->
  • 通过EasyNetQ/RabbitMQ服务总线发送->
  • 事件由处理事件及其数据的订阅者(使用从WCF服务端点初始化的DI容器)使用
  • 我做了一些测试,看看如果在MVC端通过循环相当快地调用服务,它是如何工作的

    for (int i = 0; i < 200; i++)
    {
            ...
            client.MyServiceMethod(someId, startDate); 
            ...
    }
    
    for(int i=0;i<200;i++)
    {
    ...
    client.MyServiceMethod(someId,startDate);
    ...
    }
    
    MessageQueue部分是快速的,它基于发送到队列并在同一秒内由订阅者接收的时间戳。通过WCF服务调用进行循环非常慢。循环通过它们需要很多秒。我尝试从wsHttpBinding切换到netTcpBinding,并在WCF中使用serviceThrottling


    WCF不是强制性的,但它似乎是一个单独的事件处理项目(在发布端)将是有益的,并且可以从MVC应用程序的其他位置进行物理定位(负载减少等)。WCF在这种情况下是否可行,或者我是否应该尝试使用Windows服务或其他自托管应用程序(如控制台应用程序等),或者可能使用MVC中的线程生成事件数据,或者是否存在更好的方案?这种事件处理系统的最佳实践是什么?基本上,让一些东西生成事件数据似乎是有益的,因为它必须在某个地方处理,同时不会减慢最终用户正在使用的UI。

    与其像这样尝试运行自己的基础设施,我认为您最好使用(非免费)或(免费)这样的工具。(我会考虑这种最佳做法)

    我不能代表大众运输公司发言,但我在NServiceBus方面的经验非常好。您只需要指定哪些消息要发送到哪个队列。您可以使用几种不同的排队技术,但我建议从默认的MSMQ实现开始。没有必要做WCF配置噩梦。;)


    您的所有消息处理程序也将自动包装在分布式事务中,这样,如果DB交互失败,整个消息将回滚,您将能够在将来再次尝试该消息。

    我认为您最好使用这样的工具,而不是像这样尝试滚动您自己的基础结构(不是免费)或(免费)。(我会考虑这个最佳实践)< < 我不能代表MassTransit发言,但我对NServiceBus的体验非常好。您只需要指定哪些消息进入哪个队列。您可以使用几种不同的排队技术,但我建议从默认的MSMQ实现开始。无需WCF配置噩梦。;)


    您的所有消息处理程序也将自动包装在分布式事务中,这样,如果DB交互失败,整个消息将回滚,您将能够在将来再次尝试该消息。

    如果我理解得很好,您的事件创建过程将是“繁重的”并且您希望避免在MVC过程中被创建。我猜你是在向WCF服务发送一些信息,以便让他准备活动

    您可以考虑一个避免WCF步骤的2消费者场景:

  • MVC应用程序创建并发布一个“轻”事件,其中包含创建“重”事件所需的所有数据(基本上是传递给WCF的输入数据)
  • EventCreator
    订阅者使用此消息并准备重大事件
  • 您已经存在的消费者随后将消费重事件
  • EasyNetQ已经提供了发布和使用消息的简单函数。 您在网上找到的大多数教程都建议使用TopShelf在控制台应用程序(调试)或windows服务(生产)中托管您的用户。EasyNetQ在这里有一个例子:


    如果您想“隐藏”EasyNetQ对MVC项目的依赖性,可以将EasyNetQ
    IBus
    封装到自定义
    总线上,并使用IoC容器来注入总线的特定实现。上面提供的示例使用
    Castle.Windsor
    作为IoC容器

    如果我理解得很好,您的事件创建过程是“沉重的”,您希望避免在MVC过程中创建。我猜你是在向WCF服务发送一些信息,以便让他准备活动

    您可以考虑一个避免WCF步骤的2消费者场景:

  • MVC应用程序创建并发布一个“轻”事件,其中包含创建“重”事件所需的所有数据(基本上是传递给WCF的输入数据)
  • EventCreator
    订阅者使用此消息并准备重大事件
  • 您已经存在的消费者随后将消费重事件
  • EasyNetQ已经提供了发布和使用消息的简单函数。 您在网上找到的大多数教程都建议使用TopShelf在控制台应用程序(调试)或windows服务(生产)中托管您的用户。EasyNetQ在这里有一个例子:


    如果您想“隐藏”EasyNetQ对MVC项目的依赖性,可以将EasyNetQ
    IBus
    封装到自定义
    总线上,并使用IoC容器来注入总线的特定实现。上面提供的示例使用
    Castle.Windsor
    作为IoC容器

    使用EasyNetQ作为消息队列框架简化了您提到的消息传递部分,但是它是事件创建(以及接收端的处理)w