关于多个对话 and/or 个队列
About multiple conversations and/or queues
我想知道对话的确切定义,而 MS 文档和教程与此不太相关。
首先...对话和对话之间有区别吗?
假设队列应该只包含相同的消息或等效消息(即消息类型由激活的过程以类似于 CASE WHEN / SWITCH 场景的方式处理)
是否每个对话都围绕着一个独特的队列?
如果过程 A 将消息发送到队列,激活过程 B,过程 B 处理消息然后发出应答,过程 A 可以等待应答还是应该使用过程 C?我是否可以假设我必须创建两个在同一个合同上运行的队列?但是有多少服务?在那种情况下,我将如何以及在何处使用 END CONVERSATION?
如果过程 A 将消息发送到队列,激活处理该消息的过程 B,然后为 another/some 其他过程发出 another/several 条消息C,所有那些 queues/services / 等都在同一个对话中吗?同一个聊天群? (在 GET CONVERSATION GROUP 之后我会做什么以确保我的对话在同一组中?)这是否意味着在发出 BEGIN TRANSACTION / BEGIN DIALOG 或使用
时传递相同的对话句柄
[与
[ { RELATED_CONVERSATION = related_conversation_handle
| RELATED_CONVERSATION_GROUP = related_conversation_group_id } ]
?而且......最后但并非最不重要的是,如果我使用多条消息来 parallel/fork 使用不同的参数调用 C,在这种情况下我想开始完全不同的 conversations/conversations 组做同样的事情或者有一个独特的“旁白”总是更好吗
哦...另一件事...是否有最佳实践使用多条消息调用一些治疗然后等待每一个都完成再开始另一个?有没有一种方法可以让每个过程接收一条消息,发送一个答案,然后由答案激活的过程可以 check/count 其队列中的先前消息,并且仅当它们都在那里时才继续?是否需要检查对话 ID(或对话组 ID)以确保这些消息都是由同一组答案发出的?
我希望这不会太令人困惑,但 MS 教程......嗯......有点简单化。
首先,据我所知,对话与对话是一样的。同一事物的两个名称。
队列可以包含许多不同的消息类型。这取决于处理消息的事物(无论是内部激活的存储过程还是外部应用程序)来区分类型并使用它执行 "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 必须提供的所有功能。
我想知道对话的确切定义,而 MS 文档和教程与此不太相关。
首先...对话和对话之间有区别吗?
假设队列应该只包含相同的消息或等效消息(即消息类型由激活的过程以类似于 CASE WHEN / SWITCH 场景的方式处理)
是否每个对话都围绕着一个独特的队列?
如果过程 A 将消息发送到队列,激活过程 B,过程 B 处理消息然后发出应答,过程 A 可以等待应答还是应该使用过程 C?我是否可以假设我必须创建两个在同一个合同上运行的队列?但是有多少服务?在那种情况下,我将如何以及在何处使用 END CONVERSATION?
如果过程 A 将消息发送到队列,激活处理该消息的过程 B,然后为 another/some 其他过程发出 another/several 条消息C,所有那些 queues/services / 等都在同一个对话中吗?同一个聊天群? (在 GET CONVERSATION GROUP 之后我会做什么以确保我的对话在同一组中?)这是否意味着在发出 BEGIN TRANSACTION / BEGIN DIALOG 或使用
时传递相同的对话句柄[与
[ { RELATED_CONVERSATION = related_conversation_handle
| RELATED_CONVERSATION_GROUP = related_conversation_group_id } ]
?而且......最后但并非最不重要的是,如果我使用多条消息来 parallel/fork 使用不同的参数调用 C,在这种情况下我想开始完全不同的 conversations/conversations 组做同样的事情或者有一个独特的“旁白”总是更好吗
哦...另一件事...是否有最佳实践使用多条消息调用一些治疗然后等待每一个都完成再开始另一个?有没有一种方法可以让每个过程接收一条消息,发送一个答案,然后由答案激活的过程可以 check/count 其队列中的先前消息,并且仅当它们都在那里时才继续?是否需要检查对话 ID(或对话组 ID)以确保这些消息都是由同一组答案发出的?
我希望这不会太令人困惑,但 MS 教程......嗯......有点简单化。
首先,据我所知,对话与对话是一样的。同一事物的两个名称。
队列可以包含许多不同的消息类型。这取决于处理消息的事物(无论是内部激活的存储过程还是外部应用程序)来区分类型并使用它执行 "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 必须提供的所有功能。