关于多个对话和/或队列

时间:2017-05-19 13:28:31

标签: sql-server stored-procedures service service-broker

我想知道对话的确切定义,MS文档和教程与此并不完全相符。

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

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

  • 每个对话是围绕一个唯一的队列吗?

  • 如果程序A向队列发送消息,激活处理该消息的程序B然后发出答案,程序A是否可以等待答案或者我应该使用程序C?我是否正确地假设我必须创建两个在同一合同上运行的队列?但有多少服务?在那种情况下,我将如何以及在何处使用END CONVERSATION?

  • 如果过程A向队列发送消息,激活处理该消息的过程B,则为另一个/一些其他过程C发出另一个/多个消息,这些是所有那些队列/服务/等同一个对话?同一个会话组? (在GET CONVERSATION GROUP之后我会怎样做以确保我的对话在同一组中?)这是否意味着在发出BEGIN TRANSACTION / BEGIN DIALOG或使用

    时传递相同的对话句柄

    [WITH
        [{RELATED_CONVERSATION = related_conversation_handle
          | RELATED_CONVERSATION_GROUP = related_conversation_group_id}]

?并且......最后但并非最不重要的,如果我使用多个消息来并行/分叉调用具有不同参数的C,在这种情况下我想要开始完全不同的对话/对话组做同样的事情或者是它总是更好地拥有独特的#34;旁白"

  • 哦......另一件事......有一种最佳做法是使用几条消息来调用一些治疗方法,然后在开始另一条治疗之前等待每一条治疗完成吗?是否有一种方法可以让每个程序收到一条消息,发送一个答案,然后由答案激活的程序可以检查/统计其队列中的先前消息,并且只有在它们全部存在时才继续?是否需要检查会话ID(或会话组ID)以确保这些消息都是由同一组答案发出的?

    我希望这不会让人感到困惑,但MS教程......好吧......有点过分了。

1 个答案:

答案 0 :(得分:1)

首先,就我所知,对话框与对话相同。同名的两个名字。

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

关于您是否希望队列处理器响应同一个会话或开始新会话的问题完全取决于您。我的建议是回应同一个对话,除非你知道你有充分的理由不这样做。至于如何使用同一个对话,您可以在发出text = soup.find("div", class_='metaline').next_sibling print(text) # " # 1.name:jorden> # 2.age:28 # # -- # " # 语句时获取对话句柄。当您在回复时发出后续receive时,将其用作对话句柄。

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

我们说我有一个新的雇佣流程。它有以下步骤:

  • 创建登录信息
  • 在薪资系统中创建一个条目
  • 向您的保险提供商注册

他们在同一事件中的逻辑上都是(即#34;我雇用了一名新员工")。因此,您可以将所有会话捆绑在一个会话组中,并分别跟踪各个会话。像这样:

send

现在,您可以单独跟踪每个请求,以便将它们全部绑定到同一逻辑操作。当每个服务处理消息时,它将回复成功,失败或者&#34;我需要其他东西&#34;信息。此时,您可以使用当前状态更新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 表。

服务经纪人可能会势不可挡。我的建议是考虑哪些消息需要从传递到,然后开始设计服务,消息类型,合同等等。您不太可能使用SB提供的所有功能。