【问题标题】:masstransit msmq web garden no longer sending messagesmasstransit msmq web garden 不再发送消息
【发布时间】:2013-06-24 20:30:59
【问题描述】:

我已经运行 masstransit / msmq 一段时间了,没有任何问题,使用它从 asp.net mvc 应用程序向 Windows 服务发送消息。

我的全局 asax 在 OnApplicationStarted 事件中包含以下内容:

 MessageBus = ServiceBusFactory.New(sbc =>
            {
                sbc.UseMsmq();
                sbc.VerifyMsmqConfiguration();
                sbc.UseMulticastSubscriptionClient();
                sbc.ReceiveFrom("msmq://localhost/websiteQueue");
                sbc.Subscribe(subs =>
                {

                });
            });

请注意,此总线配置为仅发送消息,不接收任何内容。这很重要。

最近我们在 IIS 中实现了一个网络花园。这是当您将工作进程的数量增加到超过 1 时。它通过旋转站点的多个副本为您获得一些性能。这就是问题所在。

Masstransit 只允许每个队列有一个实例,而且自从我们创建了网络花园以来,消息传递就间歇性地停止工作。我猜它有时会起作用,因为我很幸运能够通过主动访问队列来访问站点实例。

但就像我之前提到的,队列无论如何都没用,我从不使用它来接收任何东西。我想知道是否有某种方法可以将其转换为仅发送总线,在那里我发布消息但从不接收它们?

在短时间内,我在队列名称的末尾添加了一个 Guid.NewGuid(),它确实开始工作了。唯一的问题是每次我们重新启动站点时它都会创建 10 个新队列。这显然不是真正的永久解决方案。

【问题讨论】:

    标签: msmq masstransit


    【解决方案1】:

    拥有总线的好处是您的发件人可以不知道收件人,而只需使用 bus.Publish()。

    如果这是您想要的特性,您可能需要考虑设置瞬态队列(但可能仅适用于 RabbitMQ 传输)。

    如果了解您的消费者不是什么大不了的事,那么您绝对可以不用总线,只需使用 EndpointCacheFactory(确保它是单例):

    var endpointCache = EndpointCacheFactory
                    .New(x => x.UseMsmq())
    

    并获取您的 IEndpoint:

    var targetEndpoint = endpointCache.GetEndpoint(new Uri(targetAddress)))
    

    然后使用 .Send() 就可以了。

    【讨论】:

    • 我喜欢发布工具,并且希望不必指定我要发送到的端点。我会看看瞬态队列。
    • 瞬态队列仅适用于 RabbitMQ 传输。端点需要队列,以便它们可以在某个地方接收订阅数据。
    • 您可以做的只是拥有一个网络农场.Send()s 的端点,然后发布该端点。像msmq://localhost/bridge_me 一样,有一个服务在该队列上侦听,该队列将发布到另一个(或多个进程)。
    • 这就是我最终所做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多