关于多个对话 and/or 个队列

About multiple conversations and/or queues

我想知道对话的确切定义,而 MS 文档和教程与此不太相关。

首先...对话和对话之间有区别吗?

假设队列应该只包含相同的消息或等效消息(即消息类型由激活的过程以类似于 CASE WHEN / SWITCH 场景的方式处理)

?而且......最后但并非最不重要的是,如果我使用多条消息来 parallel/fork 使用不同的参数调用 C,在这种情况下我想开始完全不同的 conversations/conversations 组做同样的事情或者有一个独特的“旁白”总是更好吗

首先,据我所知,对话与对话是一样的。同一事物的两个名称。

队列可以包含许多不同的消息类型。这取决于处理消息的事物(无论是内部激活的存储过程还是外部应用程序)来区分类型并使用它执行 "right thing" 。一个服务只能有一个队列,但是一个队列可以有很多服务(虽然我在实践中还没有真正看到过)。服务定义了哪些消息类型可以通过服务契约接受和生成。

关于您是否希望队列处理器响应同一对话或开始新对话的问题完全取决于您。我的建议是对同一个对话做出回应,除非你知道你有充分的理由不这样做。至于如何使用同一个会话,你可以在发出receive语句时得到会话句柄。当您在回复中发出后续 send 时,将其用作对话句柄。

我对会话组的看法是,您可能需要就同一件事与不同的服务进行交谈。这是一个人为的例子:

假设我有一个新的招聘流程。它有以下步骤:

  • 创建登录
  • 在薪资系统中创建条目
  • 向您的保险公司注册

虽然它们在逻辑上都是针对同一事件的(即 "I hired a new employee")。因此,您可以将所有对话捆绑在一个对话组中,并分别跟踪各个对话。像这样:

declare @handle uniqueidentifier, @group uniqueidentifier = NEWID(), 
@message XML = '<employee name="Ben Thul" />';

BEGIN TRAN
    begin dialog @handle
        from service [EmployeeService]
        to service 'LoginService'
        on contract [LoginContract]
        with related_conversation_group = @group;

    SEND ON CONVERSATION (@handle)
        MESSAGE TYPE [NewLoginRequest]
        (@message);

    INSERT INTO [dbo].[OpenRequests]
    (
        [GroupIdentifier],
        [ConversationIdentifier],
        [ServiceName],
        [Status],
        [date_modified]
    )
    VALUES
        (@group, @handle, 'LoginService', 'RequestSent', GETUTCDATE());

    BEGIN DIALOG @handle
        FROM SERVICE [EmployeeService]
        TO SERVICE 'PayrollService'
        ON CONTRACT [PayrollContract]
        WITH RELATED_CONVERSATION_GROUP = @group;

    SEND ON CONVERSATION (@handle)
        MESSAGE TYPE [NewPayrollRequest]
        (@message);

    INSERT INTO [dbo].[OpenRequests]
    (
        [GroupIdentifier],
        [ConversationIdentifier],
        [ServiceName],
        [Status],
        [date_modified]
    )
    VALUES
        (@group, @handle, 'PayrollService', 'RequestSent', GETUTCDATE());

    BEGIN DIALOG @handle
        FROM SERVICE [EmployeeService]
        TO SERVICE 'InsuranceService'
        ON CONTRACT [InsuranceContract]
        WITH RELATED_CONVERSATION_GROUP = @group;

    SEND ON CONVERSATION (@handle)
        MESSAGE TYPE [NewInsuranceRequest]
        (@message);

    INSERT INTO [dbo].[OpenRequests]
    (
        [GroupIdentifier],
        [ConversationIdentifier],
        [ServiceName],
        [Status],
        [date_modified]
    )
    VALUES
        (@group, @handle, 'InsuranceService', 'RequestSent', GETUTCDATE());
COMMIT

现在,您有办法分别跟踪每个请求有办法将它们全部绑定到同一逻辑操作。当每个服务处理消息时,它会返回成功、失败或 "I need something else" 消息。此时您可以使用当前状态更新 OpenRequests table。

服务经纪人可能会让人不知所措。我对您的建议是考虑需要从 的地方传递哪些消息,然后围绕它开始设计服务、消息类型、契约等。您不太可能使用 SB 必须提供的所有功能。