为何使用异步的、排队消息?
队列允许灵活的工作调度,并因此极大地增强性能和可扩展性。要了解如果能做到这一点,回到订单输入应用程序示例。 订单的某些部分必须在在订单被确认完成之前处理完毕,例如订单标题、订单明细等。而其他部分在提交订单前实际上并不需要作处理,例如:记账、发货和库存等等。如果订单“可延缓的”部分可以通过一种有保障的、异步的方式处理,订单的核心部分就可以被处理的更快速。
异步消息还可以增加并行处理的机会。例如:如果您需要检查客户的信用卡和定购物品的可用性,那么同时启动两个进程将会提高整体的响应时间。
排队还可以均衡分布系统的处理能力,降低对服务器峰值处理能力的要求。例如:一个典型的接收订单速率看起来可能是这样的:
在每天开始时出现一个峰值,每天结束时出现另一个峰值。如果每条订单在创建时被录入到发货系统中,那么发货系统的负载看起来是这样的:
下午的峰值更高是因为此时正值外出送货的文书处理工作时间。如果发货系统通过队列连接到订单输入系统,那么就可以通过将一些工作转移到接收订单的间隙时间完成,从而使峰值变得平缓。
为何使用事务性消息?
消息代理支持事务性消息,这意味着消息是作为事务进行发送和接收的。如果事务失败了,消息的发送和接收将被回滚,直到处理消息的事务成功并提交处理结果才会生效。
事务性消息简化了基于消息处理应用程序的编写,因为您可以自由地、分散地发送和接收
任何有意义的消息,并且发送和接收直到事务提交时才会真正生效。如果事务被回滚了,任何消息发送都不会生效,那些被接收的消息将返回到队列中,这样就可以重新接收和处理这些消息了。
Service Broker如何解决消息处理中的难题?
基于消息的应用程序已经出现很长一段时间了,也有很多迫不得已的原因需要构建基于消息的应用,但为何这种应用程序却为数不多呢?答案在于基于消息的应用程序难以保证其正确性。不过SQL ServerService Broker解决了基于消息应用程序中几个最大的难题:消息次序、协商、多线程和接收者管理。
消息次序
在传统的可靠消息应用程序中很容易出现消息投递次序混乱。例如:应用程序A发送了消息1,2和3。应用程序B接收并确认了消息1和3,但是在接收消息2时遇到了错误,因此应用程序A重新发送2。但是,现在消息2是在消息3之后收到的。在传统的应用程序中,程序员需要通过编程来处理这个问题,要么使消息接收的先后次序无关紧要,要么先临时缓存消息3直到接收到消息2,这样就可以按顺序处理消息了。与传统应用程序相比,Service Broker对此进行了透明的处理,所有对话中的消息都是按照当初发送的次序接收的,不会出现消息顺序的断裂。
与此相关的一个问题就是重复投递。在前面的例子中,如果应用程序B收到了消息2,但是返回给应用程序A的确认消息丢失了,那么应用程序A将重新发送消息2并且应用程序B将接收到消息2两次。 同样地,Service Broker确保消息不会被投递两次,即使在事务执行过程中发生了掉电。