【问题标题】:Shared messaging queue for multiple worker threads in IISIIS 中多个工作线程的共享消息队列
【发布时间】:2011-05-03 09:30:43
【问题描述】:

我目前正在尝试将我们的新 Intranet (ASP-MVC) 与我们的寻呼系统的 Web 前端接口。寻呼机系统的前端大约有 10 年的历史,界面很差,没有文档。为此,我将 Intranet 上的表单发布到服务器,然后我们的服务器向寻呼机服务器发送一个 HTTP POST,该服务器模仿它自己的表单发送的内容。

在测试过载时(我们几乎同时发送了大约 10 条消息),寻呼机服务器崩溃了,因为系统是一个黑匣子,我们注意到的唯一区别是并发 POST,我们至少可以做的是尽量防止这种情况发生.

我想让所有消息进入一个最多每 5-10 秒发送一次的队列,但我不知道如何实现这个,有没有人有任何建议或一些基本教程的链接让我开始?

更新

我之前没有指定这个但是从浏览器的角度来看这个过程应该是同步的,即webserver从浏览器获取http POST请求,消息被放入队列,消息从队列发送,网络服务器向浏览器发送 http 响应。这不是一项高容量的服务,我希望同时请求很少,因此响应将接近即时,它更像是防止并发请求的潜在问题。

【问题讨论】:

    标签: c# asp.net asp.net-mvc iis-7 message-queue


    【解决方案1】:

    假设,您不想放弃任何请求,您的队列需要是持久的。您可以汇总自己的实现并将数据放入数据库,也可以使用 MessageQueue 作为现成的后备存储。您的 Intranet 站点将推送(发送)消息到数据库或 MSMQ。您可以编写 Windows 服务或计划的控制台应用程序以从队列中读取(使用轮询),然后将数据发布到您的寻呼机系统。

    这里有几篇关于消息队列的文章: http://www.primaryobjects.com/CMS/Article77.aspxhttp://msdn.microsoft.com/en-us/library/system.messaging.messagequeue.aspx

    【讨论】:

    • 嗨 Vinay,这听起来像是一个解决更繁重的排队需求的解决方案(虽然我肯定会看看,因为我可能需要这个来做其他事情),我已经更新了我的问题更具体。
    • @Chao,任何线程同步原语都可以实现简单的节流 - 例如,您可以在发送请求时使用静态对象作为锁,这将确保不超过一个请求可以从 appdomain 制作。显然,此解决方案不适用于网络场,如果有许多并发请求,那么您将在单个锁上阻塞 ASP.NET 工作线程,从而淹没性能。
    • 非常感谢。只是为了确保我向我们的总机团队询问了有关已发送页面的一些统计信息,并检查了发送 POST 的平均时间,并确认请求的分布不会阻塞服务器,但足够接近,以至于一些请求可能是并发的。
    【解决方案2】:

    听起来像是队列消息传递的工作! :)

    Windows 上的一些选项(不分先后)是:

    1. MSMQ
    2. 服务代理
    3. 自定义 Sql 队列
    4. 第三方排队产品

    通过所有这些实现,您将寻呼消息插入队列,然后使用工作进程将消息从队列中弹出并发送到下游服务。您的工作人员将控制队列中的流量。

    如果寻呼机服务因某种原因出现故障,您不会发送消息 - 它会留在队列中以再次重试。

    在 google 上搜索“[在此处插入技术] 入门”,我相信您会获得足够的信息和示例代码供您入门。

    MSMQ

    MSMQ 平淡无奇,易于使用。它有一些开箱即用的限制,例如 4MB 消息大小和使队列具有高可用性(每个队列实例通常由服务器上的本地存储支持)。

    如果您拥有队列的两端(发送者和接收者),则可以轻松克服 4MB 的消息大小,因为您可以通过队列将消息分块(将大于 4MB 的消息分成更小的块并在接收器上重新组装。

    克服 HA 限制通常需要存储和集群资源方面的帮助——从源系统中恢复消息可能比使用集群 MSMQ 更容易(这对我来说听起来不对,但这是我的经验——我会喜欢 MSMQ大师撰写有关成功 HA 的博客)。

    服务代理

    Service Broker 是一个很好的点对点队列解决方案,内置在 Sql Server 中(甚至 Sql Express 也有)。它唯一的缺点是缺乏工具,这使得配置管理变得困难。

    如果您有来自单个队列的多个队列使用者,Service Broker 是一个不错的选择...这使得假设 Sql Server 是 HA 的 HA 排队解决方案。

    自定义 Sql 队列

    如果您对通过 T-SQL 控制队列中的工作单元的批处理感到满意,这可能是一个不错的选择。 Service Broker 将为您处理的事情。

    如果您有来自单个队列的多个队列使用者,自定义 SQL 队列是一个不错的选择...这使得假设 Sql Server 是 HA 的 HA 队列解决方案。

    第三方排队产品

    这里可以插入许多第 3 方队列产品 - 尽管它们可能不是 Windows,甚至可能不是特定于 .NET 的。如果您的环境正在寻求实现“排队即服务”,这可能是一个很好的解决方案。您可以获得用于许多良好队列实现的 .NET 绑定。查看Advanced Message Queueing Protocol 的实现以了解更多信息。

    【讨论】:

    • 嗨,扎克,好帖子和很多细节,但我想你可能在我更新更新之前就开始了,我想可能不是我想要的,除非我可以很容易地得到它阻塞进程直到作业完成。
    • 啊!我不建议阻止 UI 线程,而是让它显示消息操作的状态(已接收、待处理、完成),如果可以提供帮助的话。你最了解你的环境。 UI 可以提交您的硬件支持的尽可能多的 msg/sec,然后让工作人员限制它实际发送这些消息的速度,以防止寻呼机服务过载。
    • 如果您绝对必须阻止,那么您可能需要引入一些工作人员响应与您的 UI 请求发送页面的相关性。您的瓶颈将是由于寻呼机服务而发送页面的工作人员。如果进入的 UI 请求多于工作人员无法满足的(由于寻呼机服务),您的用户将受到影响。关联可能不仅需要一个用于寻呼机请求的入站队列,还需要一个响应队列。您可能希望查看 NServiceBus 或 MassTransit 来帮助实现该场景。让我知道我是否过度设计! :)
    猜你喜欢
    • 1970-01-01
    • 2011-03-13
    • 2017-06-10
    • 2016-03-10
    • 2012-12-08
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多