Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server sqlserver中可靠的异步处理_Sql Server_Database_Sql Server 2008 R2_Message Queue_Service Broker - Fatal编程技术网

Sql server sqlserver中可靠的异步处理

Sql server sqlserver中可靠的异步处理,sql-server,database,sql-server-2008-r2,message-queue,service-broker,Sql Server,Database,Sql Server 2008 R2,Message Queue,Service Broker,部分服务由第三方提供给我们的客户。在其远程服务器上创建的数据将复制到本地SQL server。 我需要在我无法直接访问数据库的第三方服务器上执行一些工作。他们为此公开了一组API。该工作由SQL server代理作业在链接的SQL server上执行 业务场景:客户可以接收“徽章”。可以通过调用第三方服务器上的UpdateCustomerBadgeInfoweb方法将徽章提供给客户 因此,自动化任务的典型需求如下所示: “查找当天登录超过50次的所有客户,给他们[没有生命]徽章,并向他们发送短信

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

业务场景:客户可以接收“徽章”。可以通过调用第三方服务器上的
UpdateCustomerBadgeInfo
web方法将徽章提供给客户

因此,自动化任务的典型需求如下所示:

“查找当天登录超过50次的所有客户,给他们
[没有生命]
徽章,并向他们发送短信通知”

算法是:

- 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 server上创建了一个表,向该表提交批处理更新请求,然后由他们的服务进行验证和处理

问题是:


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

只有在我正确理解情况时,此答案才有效:

  • 用于公开web方法以逐个更新客户的第三方服务器
  • 现在,他们希望从SQLServer表中获取这些信息,以便插入/更新/删除
  • 您只需将与客户相关的请求填入此表,这些请求将在稍后处理
  • 当与客户相关的信息得到更新时,您必须执行一些额外的本地操作(队列SMS、日志活动)
一般来说,我看不到算法有任何重大变化,但我将尝试解释在这种情况下我会做什么

  • 将所有匹配的账户选择到一个#可诱惑的账户中

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

  • 对于每个客户记录…

    这应该是实现中唯一的更改。它现在的含义是——对于在第三方异步处理的每个客户记录。当然,您的第三方必须给您一些线索,说明他们确实处理了您的客户需求集,否则您不知道该处理什么。因此,当他们验证和处理数据时,他们可以提供例如可为空的列“success\u time”和“error\u time”,以便向您告知已完成的操作和时间。如果成功,则继续处理。如果没有,你也可以做些什么

    但是,当您返回异步信息时(例如,sucess_time不为NULL),如何作出反应?嗯,有多种方法可以做到这一点。就我个人而言,我尽量避免使用触发器,因为它们会让你的生活变得复杂(它们的可见性很差,会导致复制问题,会导致事务问题……),如果我真的需要一流的即时响应能力,我会使用它们。另一种可能性是使用带有自定义激活的异步队列,这意味着Service Broker。然而,很多人都避免使用SB技术-它不同于SQL server的其他部分,它有其特定性,调试不如简单的旧SQL语句等容易。另一种可能是使用代理作业批处理异步响应。既然你已经在使用一个作业了,你应该可以接受它。基本上,该表应该充当同步点—您填写请求(插入),第三方处理请求(选择)。处理请求后,它们会将请求标记为(更新成功时间或错误时间),最后使用代理作业任务处理该响应(选择)。您的处理包括短信和日志记录,甚至可能从第三方表中删除

    另一件需要提及的事情是,这里需要同步方法。首先,不要在没有事务的情况下执行任何操作,否则您可能会处理重影响应和/或跳过有效的等待响应。其次,当您选择响应(在第三方端处理的行)时,您可以使用readpass提示(跳过锁定的内容)获得一些改进。但是,如果在处理响应后需要从第三方表中更新/删除,可以使用SELECT with UPDLOCK在INSERT和update之间用数据阻止temperig的另一面。或者,如果您不完全确定所讨论的表发生了什么,就不使用任何锁定提示


  • 希望能有所帮助。

    Ozren,感谢您的快速回复!因此,基本上,如果到目前为止,所有工作都是在一个过程中完成的(有一个WHILE循环),那么现在我必须将工作分为两个单独的工作,一个是将徽章信息更新请求排队,另一个是读取已处理行的状态并发送SMS?这将是一种方法。另一种方法是让相同的作业依次处理当前响应,然后发送新请求。这样,您就不必担心自己任务之间的同步问题。然而,有两份工作是更模块化的方法。