3

我正在构建一个应用程序,该应用程序需要保留它正在发送的消息的副本,以便我可以在以后重播所有消息。这是必要的,因为消息的处理将在开发过程中发生巨大变化,但必须尽快捕获数据,因为它是实时观察数据。我似乎找不到任何直接解决这个问题的内置功能,虽然我可以编写一个自定义工具来保存数据,但这似乎与首先使用 NServiceBus 的目的相矛盾。我正在考虑的一些选项:

  1. 使用目标总线的 ForwardReceivedMessagesTo 功能创建存档队列,并构建一个简单的应用程序,该应用程序使用此存档队列作为输入队列,以便在 Replayer 工具运行时将消息简单地转发到目标总线。这确实会清除存档队列,要求首先使用 mqbkup 实用程序对其进行备份,但这可以作为重播过程的一部分自动执行。或者,使用两个交替的存档队列(一个接收新消息,一个用于重播)可以解决这个问题。

  2. 使用发布/订阅模型并让存档者订阅目标队列,将消息放入存档队列中。与上述类似的 Replayer 工具可以使用存档队列作为输入队列并将消息转发到目标。这也将清除存档队列,需要上述解决方案之一。

  3. MassTransit 的人提到了一个叫做BusDriver的东西,它允许在队列之间复制,但我找不到更多关于它的信息。

我主要关心的是选择最不可能丢失数据的方法,因为一旦进行了观察,就永远无法在狭窄的时间窗口之外再次进行。这似乎应该是一个常见问题,但我似乎无法找到直接的解决方案。建议?

更新我决定使用日志目标队列。我将让存档器将日志用作输入并将消息存储到数据库(可能只是基于文件的),并允许将消息从该数据库重播到目标队列。虽然可以编写一个将消息从日志队列复制到目标队列的工具,但真正的问题 - 从实际的角度来看 - 是管理日志队列的问题:它不容易备份(mqbkup 导致MSMQ 服务,这是不可接受的),并且在队列上进行非破坏性操作需要我编写一个基于 MSMQ 的工具,而我宁愿坚持 NServiceBus 抽象级别。归根结底,MSMQ 是一种传输方式,而不是消息存储方式,因此需要对其进行处理。

4

2 回答 2

1

#3 BusDriver 命令行参考:

BusDriver is a command-line utility used to administer queues, service bus instances and other things related to MassTransit.

Command-Line Reference

  busdriver.exe [verb] [-option:value] [--switch]

    help, --help        Displays help

    count               Counts the number of messages in the specified
                        queue

      -uri              The URI of the queue

    peek                Displays the body of messages in the queue without
                        removing the messages

      -uri              The URI of the queue
      -count            The number of messages to display

    move                Move messages from one queue to another

      -from             The URI of the source queue
      -to               The URI of the destination queue
      -count            The number of messages to move

    requeue             Requeue messages from one queue to another

      -uri              The URI of the queue
      -count            The number of messages to move

    save                Save messages from a queue to a set of files

      -uri              The URI of the source queue
      -file             The name of the file to write to (will have .1, .2
                        appended automatically for each message)
      -count            The number of messages to save
      --remove          If set, the messages will be removed from the queue

    load                Load messages from a set of files into a queue

      -uri              The URI of the destination queue
      -file             The name of the file to read from (will have .1, .2
                        appended automatically for each message)
      -count            The number of messages to load
      --remove          If set, the message file will be removed once the
                        message has been loaded

    trace               Request a trace of messages that have been received
                        by a service bus

      -uri              The URI of the control bus for the service bus
                        instance
      -count            The number of messages to request

        status          Request a status probe of the bus at the endpoint

          -uri          The URI of the control bus for the service bus instance

    exit, quit          Exit the interactive console (run without arguments
                        to start the interactive console)

Examples:

    count -uri:msmq://localhost/mt_server
        Returns the number of messages that are present in the local
        MSMQ private queue named "mt_server"

    peek -uri:msmq://localhost/mt_client
        Displays the body of the first message present in the local
        MSMQ private queue named "mt_client"

    trace -uri:msmq://localhost/mt_subscriptions
        Requests and displays a trace of the last 100 messages received
        by the mt_subscriptions (the default queue name used by the
        subscription service, which is part of the RuntimeServices)

    move -from:msmq://localhost/mt_server_error -to:msmq://localhost/mt_server
        Moves one message from the mt_server_error queue to the mt_server
        queue (typically done to reprocess a message that was previously
        moved to the error queue due to a processing error, etc.)
于 2012-06-06T16:45:59.437 回答
1

第一种选择似乎可行。我要补充一点,NSB 带有一个名为 ReturnToSourceQueue.exe 的工具,它可以为您重播消息。您可以打开日记功能以保留消息,但由于无法滚动,因此必须进行一些清理。我们有 NetApp,我们使用它的 SnapMirror 来备份队列数据,我敢肯定那里有类似的东西。

于 2011-03-12T13:54:03.783 回答