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