我们的目标:不断生成的记录可靠的传输到中央SQL。
摘要:卫星需要问的中央是什么在其一侧的最新数据,然后它会不断发送较新的。
卫星SQL服务器可能是(重新)有时开始(以基于物理的生产机器有关的),中央SQL机器可能运行的时间更长,但也可以有一些停机时间。 该行大多是可靠的,但没有人知道......我想到了连接问题,可以通过在SQL Server Service Broker的自然解决。 但是,我需要解决的初始握手的问题,并发送数据。 我需要设计的协议,我SSB知识仍然很差。
我希望我的理解通信的使用SSB这是很好的,并简要描述为基础
你应该对自己的谈话每个工作项目启动。 生产者(引发剂)开始一个对话,并发送描述该工作项的消息,然后提交。 消费者(目标)接收消息(或被激活),检查有效载荷了解工作项目的详细信息,执行的工作,然后结束该对话和提交。 将所得的EndDialog消息被发送回到发起者服务队列中,并且在启动器队列的活化过程通过结束对引发剂侧的对话框响应它。
...由瑞摩斯Rusanu(如果有兴趣看到在他早期的回答更多的细节 )。
我想(在这里一个多字符串)发送记录,因为像这样的XML消息
<row a="1" b="11" c="111" />
<row a="2" b="22" c="222" />
<row a="3" b="33" c="333" />
<row a="4" b="44" c="444" />
我已经学会了如何写SELECT
获得从XML消息的信息 。
通讯:假设SQL服务器之间的通信机制,只是激活...
卫星SQL获得的新数据,并以某种方式它知道有卫星和中央之间没有未决消息。 但是,这也并不知道什么数据已被发送到中央。 因此,它有权要求中央是什么它最后可用的数据。
如果我理解的
END CONVERSATION
正确,该命令的原因只发送一种空消息的N'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
。 正因为如此,中央也许应该把我的类型ReplyMessage
与答案前回END CONVERSATION
。同时,卫星也许应该什么都不做的行为异步地(即发送后等待
RequestMessage
)。 一旦ReplyMessage
到达时,它会激活卫星的过程,:- 接收到该消息,并得到想要的信息,
- 接收的EndDialog消息,并且在卫星侧端先前的对话框,
- 准备要发送到中央(XML字符串形式)中的数据,
- 打开新的对话框,
- 发送准备好的数据,
- 并且使自己处于休眠状态,直到另一个
ReplyMessage
到达。
中央应该表现相似。 一旦
RequestMessage
到达时,它会激活中心的过程,:- 接收到该请求消息时,
- 提取XML信息并更新中央数据库,
- 得到有关卫星的最后一个可用的数据信息,
- 形式并发送
ReplyMessage
, - 结束于中央侧的对话框。
到目前为止,我的观点正确吗?
现在的一些细节,我不知道:我想让它强大的,没有人情味的工作,在安装的时候机制就应该开始了自己。 通信应该总是通过卫星开始(中央可能不知道,即使卫星的工作原理,甚至存在)。
该卫星已经使用由被处理,以建立一个在中心收集的记录的原始数据发射的扳机。 通过这种方式,触发可启动莫名其妙卫星到中央的第一SSB请求。 但...
- 如何触发器可以检查有卫星和中央之间没有悬而未决的沟通? 由于卫星总是始作俑者,这个问题也可配制成...如何触发器可以检查是否卫星等待一些
ReplyMessage
? 或者说,如何知道有卫星和中央之间的一些打开的对话框?- 如果没有对话,触发形成的数据记录(存储在本地表),然后就可以开始通信理线(见上文第1点)。
- 如果有任何对话,触发仅形成是记录稍后发送,并没有别的做。 当数据将被发送
ReplyMessage
由活化的方法得到(参见上面的点3)。
- 在使卫星处于休眠状态 (见第3点的最后一颗子弹或以上)我的意思是,应该有可能是在消息队列中没有其他消息(没有在环中处理的)和被激活的过程是自然完成。 但我不知道如果我想在这里正确。 你对此有何评论?
- 如果没有被打破,如果数据产生速度不够快,卫星和中央一贯的东西来交换。 通过这种方式,触发决不应该试图开始通信。
- 如果没有别的通过激活卫星程序发送到中央(实际上,它是不活动),或当系统重新启动某种方式(无对话还不存在),触发启动通信过程。 但是,我怎么能这样做呢? 如果触发只需发送
RequestMessage
到中央? (这样的ReplyMessage
会激活卫星的过程和程序将继续下去,直到有什么事情要处理。) - 说了,
RequestMessage
意味着这里是一些数据,对它们进行处理,并回复什么是最后一个 (或何去何从应该是发送或从中央建议采取什么下一步行动-依赖于经营业务逻辑,也许这里并不重要)。 是否确定发送空XML在RequestMessage
在我不知道你需要什么其他的意义-告诉我吗?
首先更新 -基于以下莱姆斯Rusanu的答案 。
我不得不承认,这将是健谈的协议。 此外,记录被从所述真实环境创建为温度样本和取样的频率是相当低的。 这意味着复杂的协议,只有在重新启动一切左右的特殊情况是有用的。
但是,当谈话要永远保持开放,在该对话框手柄或唯一标识应持久地存储在一些配置表,或者它甚至可以被硬连接到代码。 触发器将立即在飞行中发送的记录,和中央根本不会发送ReplyMessage
。 这是正确的吗? 可那种coversation来有效地认为是独白?
第二次更新 ,使这个问题相当短。
见延续服务代理:应该如何触发启动无限打开的对话框?