0

一台技术机器使用 SQL Server Express 来收集温度等数据......数据库每隔几秒钟更新一次(即低流量)。机器及其 SQL Server 必须在任何事情上独立工作。有时,技术计算机(即 SQL Server)与机器一起关闭。

中央 SQL Server 标准版应该像上面那样从多台机器上收集数据。

你会推荐什么场景?

  • 机器在创建表时发送每个新行(即每隔几秒发送一行)。
  • 机器启动发送数据的过程,比如每小时发送一次,并发送所有包含新收集数据的行。
  • 还有其他方法吗?

如果我很好地理解了 Service Broker 的想法,就会有请求消息类型的单一名称、回复消息类型的单一名称、合同的单一名称。SQL 机器上的相关数据库各有一个消息队列,以及相关的服务。

我对 Service Broker 很陌生。教程示例展示了如何将消息作为 XML 片段发送。这是发送表格行的真实世界方式吗?如何可靠地将SELECT命令的结果转换为 XML 片段并返回?

谢谢,彼得

注意:相关问题Service Broker — 如何从 XML 消息中提取行?被创建。

4

2 回答 2

3

我还建议在更新数据库时发送,每行插入一条消息(每条语句一条消息,来自 JAnis 建议的触发器,如果​​您的 INSERT 语句没有在单个语句中插入大量行,则也可以正常工作)。

发送许多小消息而不是发送一条大消息更好的原因是,在 RECEIVE 上处理一个 XML 有效负载的效率低于处理许多小型 XML 有效负载。

我已经看到了与您尝试做的类似的部署,请参阅High Volume Contigous Real Time Audit And ETL。我还建议您阅读重用对话

Service Broker 将很好地处理 Express 实例的开关或长时间断开连接。它只会保留发送的消息并在连接恢复后传递它们。您只需确保Express的 10GB 最大数据库大小限制足以在需要时保留消息,直到连接恢复。

Service Broker 处理不好的情况是,如果 Express 每次连接回来时都显示为不同的 DNS 名称(想想从家里、办公室和星巴克连接的笔记本电脑)。Service Broker 使用数据库路由将确认从中央服务器发送到您的 Express 实例,并且路由需要静态 DNS。同样重要的是 Express 实例可以从中央服务器访问(即不在网络地址转换之后)。对于移动实例(前面提到的笔记本电脑),动态名称和大部分时间从 NAT 后面连接的事实都会导致问题。使用 VPN 可以解决这些问题,但很麻烦。

于 2012-07-18T20:53:06.380 回答
2

好吧,如果您在触发器中实现行发送,那么发送实际上会发生(而不是偶尔)。您始终可以通过偶尔激活过程(RECEIVE)来处理接收方收集的消息。

要将行作为 XML 发送,您可以在触发器中使用语句:

Declare @msg XML;
Set @msg =
    (
        Select  * from Inserted FOR XML RAW, Type
    )

然后只需发送一条消息。

于 2012-07-18T14:56:10.563 回答