1

如何向现有合同添加新的消息类型?

CREATE CONTRACTDROP CONTRACT命令存在,但没有ALTER命令。

4

2 回答 2

6

ALTER CONTRACT不是因为遗漏而出错,是设计遗漏。这就像要求更改 COM 接口:不支持,因为接口是一个协定。如果一方改变了接口,就破坏了合约,会导致另一方在调用错误的v-table入口时崩溃。在 Service Broker 设计中应用了完全相同的推理:一方无法更改(ALTER)合约并开始发送一些另一方未预料到的新消息,这将导致其崩溃(消息处理过程中的错误)。合同是不可变的

如果您说“但我也可以ALTER让对方也可以”,那么您就没有考虑真正的用例,当对方处于远程位置并且经常处于不同的管理控制之下并且不愿意更改其合同时。即使可以进行更改,部署需要多方推出新位的分布式更改也只是要求(不必要的!)停机时间。

通信模式的变化必须部署为新的合约。服务可以实现多个契约,并且支持向服务添加新契约(通过ALTER SERVICE)。分布式应用程序的更改是通过部署新合约同时仍支持旧合约,然后淘汰旧合约(即重叠)来推出的。

于 2013-10-23T16:45:38.913 回答
0

这里:-

一个糟糕的解决方法是将所有更改版本化为新合同,但这将需要额外的服务和队列,并且现有对话将无法从新消息类型中受益。

我强烈建议支持更改合同命令,但也添加对 SSDT 的支持以发出更改命令而不是删除/创建。

我高度重新考虑了这个要求。或至少:添加一条检查和错误消息,以在任何存在使用该服务和/合同的对话存在时从 SSDT 引发,然后以类似于 SSDT 在删除所述表之前检查表中现有数据的方式进行删除。这至少有助于提高对这种副作用的认识,并避免部署难题。

于 2013-10-22T15:29:01.760 回答