azure 在逻辑应用程序中运行存储过程时出现GatewayTimeout问题

m1m5dgzv  于 2022-12-14  发布在  其他
关注(0)|答案(3)|浏览(191)

我们在使用Azure Logic Apps服务和SQL数据库同时运行三个存储过程(SP)时遇到了问题。
无论SP的运行顺序如何,问题始终会出现在运行的第一个SP中。
处理最初通常需要几秒钟的时间来运行和成功执行,但我们注意到执行时间和所需的DTU(数据库吞吐量单位)每天都在增加。
其中一个SP使用了一个变量,该变量按日期过滤表格TABLE1,并在TABLE2中仅显示“当前日期”数据。过滤器变量(SP中使用)在Logic App中定义为SUBSTRING(startOfDay(utcNow()), 0, 10),它返回当前日期值。
我们的代码只过滤当天TABLE1的值,将其放入TABLE2,对其运行一些计算,并将结果存储回TABLE1First_ValueINSERT函数用于SP代码内部。INSERT函数用于将结果行插入TABLE1(大约74行)。
TABLE1中记录的数据行数每天都在增加,但TABLE2中的数据行数是恒定的,因为它是过滤“当天”的结果,所以它只显示当天的值。
使用SQL Server Management Studio,可以手动执行SP,而不会出现任何问题。
一开始,当我们的数据库DTU设置为400时,第一个SP的Logic App执行时间不到10分钟,其余两个SP的执行时间分别为几秒钟。
最近,第一个SP无法执行,出现GatewayTimeout错误,逻辑应用程序执行失败:

当我们将DTU增加到800时,逻辑应用程序成功运行,但我们仍然收到GatewayTimeout警告。

检查了与数据库的连接,测试了每个单独SP的手动执行,将筛选变量数据类型从datetime更改为varchar(以与Logic Apps参数匹配),但问题仍然出现。
有一种趋势是,如果不解决这个问题,它将再次出现。有什么建议吗?

  • 谢谢-谢谢
    更新
    这是一个SP的代码:
WITH enTotTable 
AS 
  (
    SELECT --TOP(100)
        se.id
        , se.gatewayName
        , se.deviceId
        , se.ts
        , se.pointNameId

        , case 
            when se.presentValue < 0 then 0 else se.presentValue end as presentValue
        , DATEPART(hh,se.ts) as hTs
    FROM dbo.SolarEnergyTable se
    WHERE se.gatewayName IN ('DPJW', 'DAN1') and se.pointNameId = 7 and not se.presentValue = 0 and se.ts >= @tsFilter
  ) 

, calculationTable AS
  (

    SELECT distinct
            FORMAT ( tot.ts , 'yyyy-MM-dd' ) as dayTs
            ,tot.deviceId
            ,tot.gatewayName

            , CASE 
                WHEN  Last_VALUE(tot.hTs) OVER(partition by tot.deviceId, DATEPART(dd, tot.ts)
                    ORDER by tot.hTs ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) 
                    - FIRST_VALUE(tot.hTs) OVER(partition by tot.deviceId, DATEPART(dd, tot.ts)
                    ORDER by tot.hTs ) >=12 
                then 1 
                Else NULL end as ifAllDay

            , CASE 
                WHEN  Last_VALUE(tot.hTs) OVER(partition by tot.deviceId, DATEPART(dd, tot.ts)
                    ORDER by tot.hTs ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) 
                    - FIRST_VALUE(tot.hTs) OVER(partition by tot.deviceId, DATEPART(dd, tot.ts)
                    ORDER by tot.hTs ) >=12 
                then (LAST_VALUE(tot.presentValue) OVER(partition by tot.deviceId, DAY(tot.ts)
                        ORDER by tot.deviceId desc, tot.ts
                        ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) 
                    - FIRST_VALUE(tot.presentValue) OVER(partition by tot.deviceId, DAY(tot.ts)
                        ORDER by tot.deviceId desc, tot.ts) )
                else NULL 
                end as enTdy

            ,case 
                when LAST_VALUE(tot.presentValue) OVER(partition by tot.deviceId, DAY(tot.ts)
                    ORDER by tot.deviceId desc, tot.ts
                    ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) < 0 then NULL

                else  
                    LAST_VALUE(tot.presentValue) OVER(partition by tot.deviceId, DAY(tot.ts)
                    ORDER by tot.deviceId desc, tot.ts
                    ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) 
                end as lastPvalueDay
            , case 
                when FIRST_VALUE(tot.presentValue) OVER(partition by tot.deviceId, DAY(tot.ts)
                    ORDER by tot.deviceId desc, tot.ts
                    ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) < 0 then NULL

                else 
                    FIRST_VALUE(tot.presentValue) OVER(partition by tot.deviceId, DAY(tot.ts)
                    ORDER by tot.deviceId desc, tot.ts) 
                end as firstPvalueDay            
    FROM enTotTable tot 
    WHERE not tot.presentValue = 0 
  )

, plantAndTdyTable 
AS
(   
    SELECT 
        tdy.gatewayName
        ,tdy.dayTs as ts
        ,CAST(2 as INT) as deviceId
        , CAST(20 as INT) as pointNameId
        , Case When 
            tdy.ifAllDay = 1 
            then SUM(tdy.lastPvalueDay)-SUM(tdy.firstPvalueDay)
            else NULL end as presentValue
    FROM calculationTable tdy
    GROUP BY tdy.dayTs ,tdy.ifAllDay, tdy.gatewayName
 UNION

    SELECT 
        tdy.gatewayName
        ,tdy.dayTs as ts
        ,CAST(2 as INT) as deviceId
        , CAST(17 as INT) as pointNameId
        ,SUM(tdy.lastPvalueDay) as presentValue
    FROM calculationTable tdy
    GROUP BY tdy.dayTs, tdy.gatewayName
 UNION

    SELECT 
        tdy.gatewayName
        , tdy.dayTs as ts
        , tdy.deviceId
        , CAST(6 as INT) as pointNameId
        , tdy.enTDY as presentValue
  From calculationTable tdy
  
)

INSERT INTO [dbo].[SolarEnergyTable]
SELECT 
    pt.gatewayName
    ,pt.ts
    ,pt.deviceId
    ,pt.pointNameId
    ,pt.presentValue
FROM plantAndTdyTable pt


-- SELECT *
-- From
-- plantAndTdyTable
-- -- calculationTable
-- -- enTotTable
fjnneemd

fjnneemd2#

我最终更改了运行SP的架构。为了避免Logic应用程序在需要连接到数据库时出现GatewayTimeout,我使用了azure自动化帐户。我创建了一个PowerShell脚本来运行SP,并使用Logic应用程序来运行PowerShell脚本。在我的情况下,它运行得更好。

qni6mghb

qni6mghb3#

您可以在逻辑应用程序本身中进行重试策略设置。此设置对于处理超时问题也很有用。enter image description here

相关问题