sql - SQL Service Broker:收集数据-插件方案分析

标签 sql sql-server service-broker

(2012年12月6日的第二次更新-新协议,观点截然不同)

问题是下面的解决方案对您来说是否合理,或者是否存在我没​​有注意到的任何缺陷(对于SQL Server Service Broker来说是相当新的)...

我想继续分析SQL Service Broker: Collecting data from distributed sources中提出的问题。我想集中讨论从卫星SQL服务器收集数据时要使用的协议问题。必须使用SQL Server Service Broker,这也是由此处未介绍的其他原因所决定的。因此,请不要提出完全替代的解决方案。

我想着重于应该做什么以及如何针对特定问题自然地(最好的方式)使用Service Broker的细节。总体目标was presented in the above mentioned question。图片第一:


现在要考虑更多细节...

想要插件架构

卫星机器与真实的物理生产线有关。有可能在技术过程中添加了一些机器,有的机器可能消失了,有的机器可以被替换,就某种意义上说,它将使用相同的生产线标识,但是在物理上是不同的,即它的SQL Server是不同的实例。

中央服务器直到从卫星获得第一条消息之前,对卫星一无所知。卫星服务器没有集中式数据库。不知道系统中将包含什么以及有多少个卫星SQL服务器。始终由卫星站点决定。

与收集数据有关的任何活动应由卫星机器产生的事件启动。

重要提示:目标是连续传输所有新创建的数据(来自传感器),并发现和修复丢失-独立于可能导致它们的原因。

给你具体的例子:


由行号3(黄色)标识的机器最近已添加到环境中。它的SQL Server Express已启动,并开始收集传感器数据(第三方解决方案,具有特殊结构的专用表)。机器尚未连接到中央服务器。
唯一的配置是可靠分配的生产线固定标识(此处为3),以及连接到中央SQL Server的所有必要详细信息。但是中央SQL Server不知道该信息。中央服务器刚刚准备好接受任何新来源的数据,但永远不知道何时。 (已经针对问题using the approach suggested by Remus Rusanu answer的一台计算机SQL Service Broker — one central SQL and more satelite SQL…对其进行了测试。)
不久之后,该SQL软件就部署在了机器3上。它开始与中央对话。卫星部分不是哑巴,但它的活动是在将新记录插入传感器数据表时发送传感器数据(请参见上面的第1点)。根据记录,计算UTC时间(根据专有格式),将一条记录中的多个传感器数据转换为相同数量的规范化记录(格式为一条XML消息),然后发送到中央SQL Server。
消息由卫星机器发送的传感器数据激活了中央控制器。物理连接的失败被Service Broker队列掩盖。
在合理的时间间隔(此处为一小时)之后,中央服务器检查是否应处理到目前为止收集的数据。有一个工作单元需要一些生产时间,因此应该处理数据并将其添加到该单元的文档中。仅当单元完成后才进行处理。
中央还检查它是否具有该单元的所有数据。由于传感器采样是在已知的定期间隔(此处大约为1分钟)内进行的,因此中心可以检查是否有一些掉落。当卫星未通过SSB连接到中心时,时间间隔也有一个初始的“丢失”。该机制应从任何情况中恢复。也可能发生传感器未按顺序收集或数据未收集的情况。在中心检测到的退出实际上可能意味着中心问:“在此时间间隔内,我没有来自您的数据。如果它们存在,请向我发送其中一些,或者告诉我它们不存在。”
卫星应该只发送在采样时间之间可以发送的尽可能多的数据。从辍学中恢复可能会相当缓慢。在中央服务器上处理数据的延迟并不重要。但是,中心应知道数据何时准备就绪(或在检测到的时间间隔内不存在)。


一些图片,更多解决方案详细信息



我选择"Recycling conversations" by Remus Rusanu作为卫星和中央之间通信的基本框架。它定义了EndOfStream消息类型,以表示应丢弃对话句柄并应使用新的句柄。生命周期受到Service Broker计时器生成的上述一小时间隔的限制。

该消息在中央服务器上也被(错误地)用于激活数据处理。大约在同一时间,中央检查是否有辍学。中央保持时间低于已检查的辍学时间。这样,它就知道可以处理哪些数据了。

您认为这种情况合理吗?您能看到任何问题吗?

(我将对问题进行细化以反映您的建议。)

感谢您的时间和经验,祝您有愉快的一天。

彼得

最佳答案

所有数据应存储在表中。在附属方面,您应该为要存储的最后处理的行创建一个表。当来自Central的新请求到达时,新数据包将根据最后处理的记录值发送回Central。
注意:我建议根据您的数据限制要发送的行数,以免创建非常大的数据包。
当Central处理所有行时,应将适当的消息发送到Satellite。它还应包含有关发生的数据导入错误的信息。
您可以在注册数据库活动(在Central / Satellite数据库上使用DML / DDL触发器)或在计划内(使用Central Agent作业)启动Service Broker对话。

关于sql - SQL Service Broker:收集数据-插件方案分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12547810/

相关文章:

c# - 编辑多对多关联表中的记录

c# - 如何以编程方式测试 SQL Server 是否支持 'AT TIME ZONE' ?

sql-server-2008-r2 - 使用 BULK INSERT 的服务代理激活程序?

mysql - SQL查询以制作列表等

sql-server - 基于连接字符串/环境的 SSMS 颜色选项卡

java - 如何使用 Cloud Foundry Java API 从自定义服务绑定(bind)请求获取数据?

sql-server - Service Broker : Sys. Conversation_endpoints 在使用 With Cleanup 时填充 CO/CONVERSING 消息

java - 用户角色的默认值 - Spring security

mysql - 条件 SQL

sql - 为什么这个正则表达式在 postgreSQL 中不起作用