【问题标题】:RabbitMq producer insider .NET web applicationRabbitMq 生产者内幕 .NET Web 应用程序
【发布时间】:2015-07-16 09:28:17
【问题描述】:

是否建议使用 .NET Web 应用程序作为 RabbitMQ 生产者?

我问这个是因为不建议使用 RabbitMQ 消费者内部 IIS Web 应用程序:https://stackoverflow.com/a/25571635/2107373

在我的例子中,ASP.NET Web 应用程序托管在 IIS 上并在负载平衡器(多个实例)后面运行。

【问题讨论】:

    标签: c# asp.net rabbitmq


    【解决方案1】:

    我们有一个 Web 应用程序,可以将消息排队到 RabbitMQ 以供后端的不同应用程序使用,并且不会遇到任何问题。

    您提到的问题中提到的问题与 IIS 应用程序池的不可靠性有关,如果您处理在其中创建和排队消息的所有工作,这应该不是问题用户请求的范围。

    如果是这种情况,那么请求要么被成功处理——一条消息被创建并排队并发送一个确认响应有一个错误——没有消息被发送并且用户被通知不同的回应方式。

    我们面临的最大挑战是处理发送重复消息的可能性 - 在我们的例子中,我们检查了消费应用程序以确保工作没有完成两次,并将 RabbitMQ 生产者绑定到底层的范围(sql) 数据库事务,因此仅在成功提交时发送。

    关于使用 RabbitMQ 作为实现后端作业处理的机制的优势,这里还有一个有用的答案:Use of messaging like RabbitMQ in web application?

    【讨论】:

      【解决方案2】:

      我有一些在生产中运行得非常可靠的东西。它只发布消息,所以唯一关心的是管理与代理的连接。根据您不想打开连接的消息量,发布一条消息然后关闭它。

      我使用缓存来处理这个问题。连接对象(实际上是 EasyNetQ 总线)使用滑动过期进行缓存,如果在窗口生命周期内未使用连接,则注册 CacheItemRemoved 回调以关闭连接。我也将优先级设置为CacheItemPriority.NotRemovable

      我不确定您的缓存是如何在您的网络场中设置的,因此可能存在序列化问题。不过,在每个单独的服务器上将其缓存在内存中应该可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-12
        • 2013-03-25
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 2016-03-01
        • 1970-01-01
        相关资源
        最近更新 更多