【问题标题】:NServiceBus design help (Initializing a service instance with messages)NServiceBus 设计帮助(使用消息初始化服务实例)
【发布时间】:2011-05-14 13:07:18
【问题描述】:

我正在寻找一种替代设计,或者可能是我在使用 MSMQ 消息传递时遇到的这个问题的解决方法。现在我正在为我的服务架构使用 NServiceBus(不是问题)。它工作得很好,我非常喜欢它。但是,我在处理正常工作负载消息之前要在启动时初始化的服务遇到了一些问题。让我解释一下我的情况。

假设我有 2 个服务,数据访问 (DA) 和一个处理引擎 (PE)。

PE 执行 2 个任务:

  1. 从 DA 加载一些配置信息。
  2. 处理传入的客户端请求。

问题在于配置。我不能保证在服务启动后它收到的第一条消息是配置消息。我知道您可以在启动时清除队列中的所有消息,但我不想这样做,因为我需要处理所有消息。其次,即使我清除了队列中的所有消息,仍然不能保证配置会首先加载,事实上,由于该服务正在处理大量消息,它不太可能是收到的第一条消息。

我的问题是你们过去做了什么来解决基于消息的架构的这些类型的问题。我在这里创造了大罪,并假设消息将以某种顺序到达,这与事实相去甚远。

【问题讨论】:

    标签: msmq soa nservicebus


    【解决方案1】:

    您可以使用两个不同的队列。一为工作量。第二个用于配置(或元数据)。其他选项是使用优先级。您可以为配置消息设置更高的优先级,以便首先读取它们。

    也就是说,我根本不了解您的架构。 DA 服务如何知道 PE 已重启。它需要知道这一点才能发送配置消息。

    【讨论】:

    • 是的,我查看了优先级,实际上这正是我所需要的,但是 NServiceBus 要求所有队列都是事务性的,但事务性队列不能优先考虑......幸运的是吗?我认为最好的解决方案是像你说的那样使用两个队列。一个用于初始化,一个用于处理。我先尝试实施此解决方案,然后中途停止,因为我发现了优先级。
    • 回答您的第二个问题,当 PE 服务启动时,它会向 DA 发送一条消息,请求配置文件。
    • 感谢 Igal,我最终使用了 2 个队列。我使用一个进行初始化,然后在初始化完成后切换到主要的。似乎就像我需要的那样工作。
    【解决方案2】:

    您真的应该考虑在每个需要它的服务中加载配置。至于变通方法,您可以向另一个端点发送请求消息以进行配置,然后继续调用 Bus.HandleCurrentMessageLater() 直到获得相关回复。这不是最优的,因为在配置发生之前,非配置消息会在队列中累积。

    【讨论】:

    • 是的,我也考虑过。但是就像你说的那样,非配置消息会很快建立起来。启动服务时,队列中可能有几千条消息。对我来说最简单的事情是在本地而不是通过外部服务加载配置,但是我试图避免所有服务中的数据库连接字符串,它变得非常难以管理。
    • 您是否考虑过标准的 Web 服务 RPC?
    • 不,我从来没有真正想到过,但也许这也是一个很好的解决方案。所有的配置都是 XML 反正实现起来很简单。
    【解决方案3】:

    每个服务都应对自己的数据负责。 所以你的处理引擎应该知道它需要知道的准确的配置选项才能正常工作。 您似乎混淆了一些东西,并且有一个使用 2 个 Windows 服务的服务,其中一个服务依赖于另一个服务。

    通常,您的处理引擎会直接访问它所操作的对象的数据库。如果存在从另一个服务中配置的配置设置,您的处理引擎将存储该配置选项并提供接口来更新该配置选项。因此,如果您的处理引擎在线,则无论您的数据库访问过程是否有效,都可以处理您的客户端请求。如果数据库访问进程上线并检测到配置更改,它将通知所有相关进程配置更改。

    我建议重新考虑您的架构。

    【讨论】:

    • 我的服务有超过 30 个实例正在运行,因为我正在进行大量的处理。只有少数 DA 层被使用。我不希望 30 个实例中的每一个都与我的数据库建立数据库连接。我当然知道我不想为所有这些服务配置连接字符串(我确信它可以以某种方式自动化,但仍然如此)。
    • 我认为将数据库访问和其他服务分开并不是那么糟糕,到目前为止,它对我的​​整个系统来说效果很好。我并不是说系统没有缺陷,因为我们可以看到我已经有一个需要解决的问题,但是有 2 个队列很容易解决这个问题。确实,这是一个依赖进程,但我更愿意拥有一个依赖进程,而不是依赖 API 或 DLL,因为任何更改都需要重新发布。这是一个运行着 30 多个实例的分布式系统。如果需要更新每个 DA,那么对 DA 的简单更新将是一件痛苦的事情。
    【解决方案4】:

    你看过分销商吗? 另请查看 ICustomConfigurationSource,您可以在 Windows 服务启动时(在它开始处理消息之前)使用它来检索端点配置

    【讨论】:

    • 据我了解,ICustomConfigurationSource 是使用 app.config 的替代方案,我不确定这对我有什么好处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多