SQL Server中可靠的异步处理

时间:2013-07-06 17:24:26

标签: sql-server database sql-server-2008-r2 message-queue service-broker

部分服务由第三方提供给我们的客户。在其远程服务器上创建的数据将复制到本地SQL Server。 我需要在第三方服务器上执行一些工作,我无法直接访问该数据库。他们为此目的公开了一组API。该工作由SQL Server代理作业在链接的SQL服务器上执行。

业务场景:客户可以收到“徽章”。可以通过在第三方服务器上调用UpdateCustomerBadgeInfo网络方法向客户提供徽章。

因此,自动化任务的典型要求如下:

“查找在当天登录超过50次的所有客户,向他们提供[has-no-life]徽章并向他们发送短信通知”

算法将是:

- Select all the matching accounts into a #TempTable  
 for each customer record:
 - Call UpdateCustomerBadgeInfo() method (via CLR)
 - If successfully updated badge info-> Enqueue SMS message (queue table)
 - Log successful actions (so that the record will not be picked up next time)

现在它的工作方式最大的问题是在WHILE循环中处理大型数据集需要花费大量时间。

因此,第三方提供商创建了一个解决方案来执行客户数据的批量更新。他们在本地SQL服务器上创建了一个表,批量更新请求被提交到该服务器,然后由他们的服务选择以进行验证和处理。

问题是:

如何更改上述算法以适应此异步模型?

1 个答案:

答案 0 :(得分:2)

这个答案只有在我理解正确的情况下才有效:

  • 第三方服务器用于公开Web方法以逐一更新客户
  • 现在他们希望从SQL Server表中获取此信息,以便INSERT / UPDATE / DELETE
  • 您可以将与客户相关的请求填入此表,并在稍后处理
  • 当客户相关信息更新时,您必须执行一些其他本地操作(队列SMS,日志活动)

通常,我没有看到算法有任何重大变化,但我会尝试解释在这种情况下我会做什么。

  1. 将所有匹配的帐户选入#TempTable

    这可能不是必要的,因为您已经有表格填写您的请求 - 第三方表格。唯一的问题是同步请求,但为了分析这一点,您必须提供更多详细信息(允许同一客户的多个请求?保护重新发出相同的请求?)

  2. 每个客户记录......

    这应该是您实施中的唯一变化。它现在具有 - ,用于在第三方上异步处理的每个客户记录。当然,您的第三方必须给您一些线索,确实他们确实处理了您的客户请求,或者您不知道该如何使用。因此,当他们验证和处理数据时,他们可以提供例如可空列的'success_time'和'error_time'为您留言已完成的内容和时间。如果成功,则继续处理。如果没有,你也可以做点什么。

    但是当你得到异步信息时如何反应(例如sucess_time IS NOT NULL)?嗯,有多种方法可以做到这一点。我个人试图避免触发器,因为它们会使你的生活变得复杂(它们的可见性很糟糕,可能导致复制问题,可能导致事务问题......)如果我真的需要一流的话,我会使用它们即时响应。另一种可能性是使用自定义激活的异步队列,这意味着 Service Broker 。但是,很多人都避免使用SB技术 - 它与SQL服务器的其他部分不同,它有其特殊性,调试并不像普通的旧SQL语句那么容易等。另一种可能是批量处理异步响应在你身边使用代理作业。由于你已经在使用一份工作,你应该没问题。基本上,表应该充当同步点 - 您填写请求(INSERT),第三方处理它们(SELECT)。处理完请求后,将它们标记为(UPDATE success_time或error_time),最后使用代理作业任务处理该响应(SELECT)。并且您的处理包括SMS消息和日志记录,甚至可能从第三方表中删除。

    另外需要提及的是,这里需要同步方法。首先,如果没有交易,请不要做任何事情,或者您最终可能会处理幽灵响应和/或跳过有效的等待响应。其次,当您选择SELECT响应(在第三方上执行的行)时,您可以使用READPAST提示进行一些改进(跳过被锁定的内容)。但是,如果您需要在处理响应后从第3方表中更新/删除,则可以使用SELECT with UPDLOCK来阻止temperig的另一侧使用INSERT和UPDATE之间的数据。 如果您不完全确定相关表格的内容,则不使用任何锁定提示。

  3. 希望它有所帮助。

相关问题