探寻MSSQL发布订阅机制的秘密

1. MSSQL发布订阅机制介绍

发布-订阅模式是指一种消息传递模式,其中消息发送者(称为发布者)不会将消息直接发送给特定接收者(称为订阅者),而是将消息分成不同的类别,无需知道哪些订阅者(如果有)可能存在。订阅者可以选择订阅并接收与其相关的消息类别。MSSQL Server提供了Publish-Subscribe功能,允许用户将一个数据库实例上的变更(如表之间的关系)实时地发布到其他数据库或应用程序。这使得数据库之间或应用程序之间的数据同步得到了较好的解决。

1.1. 发布订阅架构

发布订阅架构分为两个主要的协调器类型:

发布者(发布服务器) - 发布者可以有零个或多个订阅者,它们都订阅发布者事件的子集。发布者是设置发布,按照特定的消息类别或主题创建消息过滤器,并将其发布给已订阅它们感兴趣的主题的所有订阅者的方案的主体。

订阅者(订阅服务器) - 订阅者通过将其标识为此发布的在线终结点来订阅一个或多个发布服务器的事件。它们订阅一个主题或一组主题,收到该主题的事件后处理事件。事件可以按照每个订阅者感兴趣的事件的类别进行过滤。对于自己不感兴趣的事件,订阅者可以将其排除在订阅范围之外。每个订阅者都可以管理自定义负载,这些负载根据订阅者的要求来丰富有关事件的附加信息。

1.2. 发布订阅特点

Publish-Subscribe功能的特点如下:

异步处理 - 发布者不用直接知道哪些订阅者需要接受事件。

--以表MyTable为例 ,创建发布者myPub及其对应的Publication

EXEC sp_addpublication @publication = N'myPub', @description = N'Transactional publication of database ''MyDatabase'' from Publisher ''MyPublisher''.', @sync_method = N'concurrent_c', @retention = 0, @allow_push = N'true', @allow_pull = N'true', @allow_anonymous = N'true', @enabled_for_internet = N'false', @snapshot_in_defaultfolder = N'true', @compress_snapshot = N'false', @ftp_port = 21, @allow_subscription_copy = N'false', @add_to_active_directory = N'false', @repl_freq = N'continuous', @status = N'active'

EXEC sp_addpublication_snapshot @publication = N'myPub', @frequency_type = 1, @frequency_interval = 0, @frequency_relative_interval = 0, @frequency_recurrence_factor = 0, @frequency_subday = 0, @frequency_subday_interval = 0, @active_start_time_of_day = 0, @active_end_time_of_day = 235959, @active_start_date = 0, @active_end_date = 0, @job_login = null, @job_password = null, @publisher_security_mode = 1

EXEC sp_addarticle @publication = N'myPub', @article = N'Table_1', @source_owner = N'dbo', @source_object = N'MyTable', @destination_table = N'MyTable', @type = N'logbased', @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509F, @identityrangemanagementoption = N'manual', @destination_owner = N'dbo', @status = 24

表级别发布 - 可以发布表中的行级别操作,表项操作或用于管理表架构和供应元数据的DDL语句。

--向MSSQL终端订阅发布者

exec sp_addsubscription @publication = N'myPub', @subscriber = N'mySubscriber', @destination_db = N'MyDatabase', @subscription_type = N'Push', @sync_type = N'automatic', @article = N'all', @update_mode = N'read only', @subscriber_type = 0

发送方自动跟踪数据变化 - 发布者会自动检测数据的变化并将变化同步到所有的订阅者。

--广播发布者myPub的快照

exec sp_startpublication_snapshot @publication = N'myPub', @publisher = N'myPublisher', @publisher_db = N'myDatabase', @publication_type = 0, @login = N'myPublisherLogin', @password = N'myPublisherPassword', @nosync_type = N'automatic', @frequency_type = 2, @frequency_interval = 1, @frequency_relative_interval = 0, @frequency_recurrence_factor = 0, @frequency_subday_interval = 0, @frequency_subday_type = 0, @active_start_time_of_day = 0, @active_end_time_of_day = 235959, @active_start_date = 0, @active_end_date = 0, @p2p_conflict_retention = 0, @p2p_primary = N'false', @p2p_originator_id = 65534, @publisher_security_mode = 1

2. 发布订阅工作原理

在发布订阅模式中,MSSQL Server引入了两个重要的额外组件:发布和订阅。发布者使用发布工具创建发布。发布定义了要发布的内容、发布的广告口号、如何传递订阅、如何检测数据的更改等信息。订阅者使用订阅工具查询可用的发布,从中选择感兴趣的主题,然后订阅该主题。订阅者通过订阅工具来接收、处理已订阅发布的通知。

2.1. 发布者

MSSQL Server中的发布者用来发布更改(如插入、更新、删除)到订阅者。主要有以下几类:

独立发布者 - 运行在其自己的MSSQL Server实例中。它可以发布SQL Server中的一个或多个表、视图、存储过程、聚合或一种其他数据源。

非独立发布者 - 作为一个MSSQL Server集合的一部分而运行。使用MSSQL Server集合实施的非独立发布者从定义数据更改的目标来源(可对源服务器执行操作)获取数据,然后发布数据更改。

分发者 - 运行在MSSQL Server实例中,管理分配给其的数据库的所有复制。使用代表一个发布元数据的分发数据库来存储复制配置和状态信息。

2.2. 发布订阅工作原理

MSSQL Server发布订阅功能的工作原理如下:

设置发布 - 确认数据源后,在MSSQL Server单击“发布”以开始设置发布。您需要创建发布的名称、发行物名称以及要发布的数据源。某些数据源也需要具有权限和访问密码。

设置订阅 - 配置订阅的过程与发布类似。您需要创建订阅名称、订阅的发布名称,以及用于订阅的服务器名称或IP地址。

启用发布 - 启用发布会检查和确定订阅的集合、发行物、数据源以及发布方式。启用发布后,publisher以只读方式发送发布,创建/删除订阅、发布文章、发送提要信息、远程过滤、查看发布状态,同时订阅者会在订阅器上看到其感兴趣的变更。

检测数据修改 - 变更数据的检测器是发布器下的替代程序。这些执行程序会安装在数据库中,并在发布器中设置为活动状态。如果监视数据的系统发现数据已更改,则将此数据包标记为更改,封装数据更改的要求(更改数据的表、行和更改类型)并将其发布到订阅者。

数据库标签