【问题标题】:Microsoft Service Inter-Communication ProblemMicrosoft 服务间通信问题
【发布时间】:2010-10-04 01:34:49
【问题描述】:

我目前正在构建两个 Windows 服务:

  • 第一个从 Internet 连接获取消息并将其插入数据库。这旨在快速稳定,不做任何其他处理

  • 第二个对自上次运行以来到达的所有新消息执行批处理。

我正在尝试一种方法,以便第二个服务仅在准备好处理新消息时运行其批处理过程,并且如果第二个服务出错,第一个服务将继续运行,反之亦然。目前它每 5 秒使用一次循环。

我目前正在考虑使用消息队列,其中第一个服务仅在队列为空时写入消息,第二个服务将查看队列是否包含任何消息,如果没有进入异步等待直到消息到达,然后删除消息并运行。因此,使用队列并不是真正的队列,而是作为一个二进制开关,当它的状态发生变化时,会触发一个事件到第二个服务。

我想有一个更好的方法可以做到这一点,我还没有遇到过有人可以指出我正确的方向吗?

【问题讨论】:

    标签: windows-services msmq message-queue


    【解决方案1】:

    实际上,您的方式是完全我将如何实现这些结果。使用 MSMQ,您不必检查是否有消息写入队列,第一个服务只是写入队列,第二个服务只是从中读取以处理它(当它处于活动状态时)。

    使用 MSMQ 的美妙之处在于,一个或另一个服务可以关闭,但 队列 会启动,因此您可以继续处理。

    【讨论】:

    • 感谢您的回答 casperOne。我已经在上面稍微详细说明了我的问题。我实际上可能在这里滥用队列机制,因为我想将消息存储在数据库中而不是将它们全部存储到队列中,因此将队列用作触发事件的二进制开关。这样可以吗?
    • 你可以做这样的事情。当您在队列中发送消息时,您只需发送与数据库中记录的 id 对应的 id。但是,在双方,您应该将数据库记录和队列消息的写入以及接收包装在事务中。
    【解决方案2】:

    在我看来,对于这种情况,您只需要一个邮槽。第一个服务存储到数据库中,然后发送“工作要做”消息。另一个只是等待入站消息。

    对于这么简单的事情,MSMQ 有点重量级。然后,您也可以使用 MSMQ 并完全摆脱该数据库。 就是这样做的方法。

    【讨论】:

    • 我同意,尽管我上面的一些人不同意。他们的论点是,如果队列损坏或内存不足,我们可能会丢失消息。你可以争辩说数据库可能有同样的问题,尽管这是他们决定的。
    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2020-07-10
    • 2021-09-15
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多