会话组标识一组相关的会话。 应用程序通过会话组可以轻松地协调特定业务任务所涉及的会话。
每个会话都属于一个会话组。 每个会话组都与一个特定的服务相关联,并且,组中的所有会话都是面向该服务或者来自该服务的。 一个会话组可以包含任意数量的会话。
SQL Server 使用会话组对与特定业务任务相关联的消息提供一次顺序 (EOIO) 访问。 当应用程序发送或接收消息时,SQL Server 锁定消息所属的会话组。 因此,一次只有一个会话可以接收该会话组的消息。 会话组的锁定功能保证应用程序可以对每个会话的消息进行一次顺序 (EOIO) 处理。 由于会话组可以包含多个会话,因此应用程序可以使用会话组标识与同一业务任务相关的消息并同时处理这些消息。
对话组中的参与者之间不共享对话组。 因此,会话中的每个参与者可以根据需要自由地对会话进行分组。 应用程序无需服务提供任何特殊支持,即可管理服务间的复杂交互。
聊天组的示例
人力资源应用程序可能有一个 GetEmployeeInformation 服务,该服务结合了工资服务中的信息和福利服务中的信息。 该服务 GetEmployeeInformation 开始与每个服务的会话,并将一个会话与同一会话组中的另一个对话相关联。 无论到达的消息来自“工资单”服务还是“福利待遇”服务,Service Broker 都会将会话组标识符添加到这两个会话的每个传入消息中。 由于会话位于同一会话组中,Service Broker 提供了服务所需的所有 GetEmployeeInformation 信息,以便将福利信息与工资信息匹配,而不管服务中 GetEmployeeInformation 正在进行的请求数如何。
发到工资服务的邮件和福利服务的邮件不包含由 GetEmployeeInformation创建的对话组的对话组信息。 每个服务独立运行,并且只有 GetEmployeeInformation 服务维护有关整个业务任务的信息。 保持各服务彼此之间相互独立有助于简化每个服务的代码编写并易于维护。 保持此独立性的另一个优点是:如果一个服务不可用,另一个服务仍可继续运行。
组织应用程序状态
会话组的一个好处是:会话组标识符可以作为方便地标识和检索应用程序状态的一个键。 会话组标识符使在数据库中维护应用程序状态变得很简单。 如果完成任务涉及随时间推移交换许多消息,则保持应用程序实例的运行效率低下,只是为了维护应用程序状态。 如果在消息之间,任何与任务相关联的数据都存储在数据库中,当收到与该任务相关的下一条消息时,可以检索出这些数据,则这样的应用程序伸缩性较好。 会话组标识符可用作应用程序开发人员提供的状态表中的主键,以便快速检索与特定任务关联的状态。 有关使用会话组标识符维护状态的详细信息,请参阅 状态管理。
由于 SQL Server 每次应用程序发送或接收消息时都会锁定会话组,因此应用程序不需要显式阻止另一个程序同时更新相同的状态数据。 应用程序要做的只是锁定会话组、还原状态、处理消息、更新状态然后提交事务。
为了方便,SQL Server 允许应用程序在没有收到消息的情况下锁定下一个可用的会话组。
GET CONVERSATION GROUP使用语句,应用程序可以在处理消息之前锁定会话组并还原状态。 有关详细信息,请参阅 GET CONVERSATION GROUP 语句。
会话组生存期
Service Broker 管理会话组的生存期。 无需显式创建或销毁聊天组。 Service Broker 在下列情况下创建新会话组:
应用程序开始与现有聊天组无关的新对话。 Service Broker 创建新会话组并为该会话组分配一个新的标识符。
应用程序开始与当前不存在的对话组标识符相关的会话。 在这种情况下,Service Broker 使用指定标识符创建一个新会话组。 这表示您可以将自己指定的值分配给会话组标识符。
Service Broker 收到另一个服务所发起的新会话的第一个消息。 在这种情况下,Service Broker 使用该服务的名称和 Broker 实例标识符(如果存在的话)执行以下操作:
- 查找相应的队列。
- 创建新会话组并将其与该队列相关联。
- 创建新的会话句柄,然后将该会话句柄添加到新会话组中。
- 将传入消息置于该队列中。
Service Broker 将会话组标识符添加到创建了会话组的会话的元数据中。 只要 Service Broker 收到与该会话组关联的任何会话的消息,Service Broker 便会在将该消息输入队列前,向该消息添加会话组标识符。
会话组标识符的有效期从 Service Broker 创建该会话组标识符开始,直到所有与该标识符关联的会话全部结束为止;即,当组中的任何会话处于活动状态时,会话组标识符保证是有效的。
使用会话组标识符管理应用程序状态的应用程序,使用开发人员提供的状态表。 当应用程序确定不再需要某个状态时,应用程序必须从状态表中删除该状态。 在许多情况下,应用程序在任务成功完成后删除状态,或在错误后指示任务无法完成。 在这些情况下,应用程序通常在发送最终响应消息并结束会话的事务中包含用于删除状态的命令。 此策略可以确保应用程序状态和会话组标识符具有相同的生存期。 如果发送操作失败,则回滚删除操作。 同样,如果删除作失败,发送作将回滚,SQL Server 不会发送消息。 不管哪种情况,应用程序状态和会话组标识符都保持有效。 如果这两个操作均执行成功,则会话组标识符的生存期在程序删除相关应用程序状态的同时结束。