( 2012/12/06第二次更新 - 新协议,一种截然不同的观点)
问题在于下面的解决方案对您来说是否合理,或者是否存在我没有注意到的任何缺陷(对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服务器是不同的实例
中央服务器在收到卫星的第一条消息之前一无所知。没有卫星服务器的集中数据库。没有关于将什么和多少卫星SQL服务器包含在系统中的知识。它总是在卫星网站决定。
与收集数据有关的任何活动都应由卫星机器生成的事件启动。
重要事项:我们的目标是不断传输所有新创建的数据(来自传感器),并独立发现并修复辍学问题。
给你一个具体的例子:
最近将由行号3(黄色)标识的机器添加到环境中。它的SQL Server Express已经启动,它开始收集传感器数据(第三方解决方案,具有特殊结构的专用表)。机器尚未连接到中央服务器。
唯一的配置是生产线的可靠分配的固定标识(此处为3),以及连接到中央SQL服务器的所有必要详细信息。但是中央SQL服务器不知道这些信息。中央只是准备接受来自任何新源的数据,但永远不知道何时。 (已经针对using the approach suggested by Remus Rusanu answer问题对一台机器SQL Service Broker — one central SQL and more satelite SQL…进行了测试。)
SQL软件的部分稍后部署在机器3上。它开始与中央谈话。卫星部分并不笨,但它自己的活动是每当新记录插入传感器数据表时发送传感器数据(见上文第1点)。从记录中,计算UTC时间(从专有格式),将来自一个记录的几个传感器数据转换为相同数量的规范化记录(格式化为一个XML消息),并发送到中央SQL服务器。
中心由来自卫星机器发送的传感器数据的消息激活。 Service Broker队列掩盖了物理连接的故障。
在合理的间隔(此处为一小时)后,中央服务器会检查是否应处理到目前为止收集的数据。有一个工作单元需要一些生产时间,数据应该被处理并添加到单元的文档中。处理应该仅在单元完成时才会发生。
中央还检查是否包含该单元的所有数据。由于传感器采样以已知的规则间隔(此处约1分钟)完成,因此中央可以检查是否存在一些辍学。还有一个初始"退出"对于卫星没有通过SSB连接到中心的时间间隔。该机制应该从任何情况恢复。也可能发生传感器无法收集故障或数据的情况。中心检测到的辍学实际上可能意味着中央要求:"我没有这个时间间隔的数据。如果它们存在,请发给我一些,或告诉我它们不存在。"
卫星应该只发送可以在采样时间之间发送的那么多数据。辍学者的复苏可能相当缓慢。在中央服务器处理数据的延迟并不重要。但是,中央应该知道数据何时就绪(或者在检测到的时间间隔内不存在)。
一些图片,更多解决方案详情
我选择了"Recycling conversations" by Remus Rusanu作为卫星与中心之间通信的基本框架。它定义EndOfStream
消息类型,以表示应丢弃对话句柄并应使用新对话句柄。生命周期受Service Broker计时器生成的上述一小时间隔的限制。
在中央服务器上也使用(mis)消息来激活数据处理。大约在同一时间,中央检查辍学。中央将时间保持在已经检查过的辍学者的下方。通过这种方式,它可以知道哪些数据可以处理。
您认为该方案合理吗?你能看到它有什么问题吗?
(我将改进问题以反映您的建议。)
感谢您的时间和经验,祝您度过愉快的一天。
彼得
答案 0 :(得分:0)
所有数据都应存储在表格中。在卫星方面,您应该为要存储的最后处理的行创建一个表。当来自Central的新请求到达时,新数据包将根据上次处理的记录值发送回Central。 注意:我建议根据您的数据限制要发送的行数,以免创建非常大的数据包。
当Central处理所有行时,应将适当的消息发送到Satellite。它还应包含有关发生的数据导入错误的信息。
您可以在注册数据库活动时(在中央/卫星数据库上使用DML / DDL触发器)或在计划内(使用中央代理作业)启动Service Broker对话。