带有cosmos db的滑动窗口暂时丢失记录

时间:2017-12-23 06:30:17

标签: azure-cosmosdb azure-stream-analytics

我有一个非常标准的设置

Event hubs -> stream analytics ->cosmosdb sql

当事件进来时,我有一个流分析查询,它使用60分钟的滑动窗口将值相加并写入宇宙。我预计最多会有5000个消息/小时更新宇宙中的特定记录。我的问题是宇宙中的记录似乎被删除并重写而不是更新。当没有记录可见时,有相当长的一段时间(30秒+),即使应该有。最终,记录显示更新的值。

我只能认为,当事件进入和退出滑动窗口时,它们会导致更新,这些更新会重写记录而不是更新它,并且我会在该窗口期间查询数据库。这显然是一个非常恼人的问题,我确信我必须做错事才能有这种行为。是否有一些设置或某些诊断可能会对这个问题有所了解?

我尝试过玩宇宙中的一致性等级,但它们似乎对我所看到的东西影响不大。我以5000RU的速度运行我的宇宙系列,但我只抽出了大约10RU的数据。所以没有扩展问题。

我的查询看起来像

SELECT
    concat(cast(groupid as nvarchar(max)), ':',  cast(IPV4_SRC_ADDR as nvarchar(max))) as partitionkey,
    concat(cast(L7_PROTO_NAME as nvarchar(max)), ':lastHour') as Id,
    System.timestamp as outputtime,
    groupid,
    IPV4_SRC_ADDR,
    L7_PROTO_NAME,
    sum(IN_BYTES + OUT_BYTES) as TOTAL_BYTES
INTO
    layer7sql
FROM
    source TIMESTAMP BY [timestamp]
Group by groupid,
         IPV4_SRC_ADDR,
         L7_PROTO_NAME,
         slidingwindow(Minute,60)

我很乐意提供任何其他可能有助于理解我的问题的调试信息。

其他 记录的_rid保持不变。这些是我的输出设置

enter image description here

当我查询时,我会回来

{
    "_rid": "glpSAPQhPgA=",
    "Documents": [
        {
            "partitionkey": "2587:10.1.2.194",
            "id": "SSL:lastHour",
            "outputtime": "2017-12-23T06:28:40.960916Z",
            "groupid": "2587",
            "ipv4_src_addr": "10.1.2.194",
            "l7_proto_name": "SSL",
            "total_bytes": 322,
            "_rid": "glpSAPQhPgAMAAAAAAAAAA==",
            "_self": "dbs/glpSAA==/colls/glpSAPQhPgA=/docs/glpSAPQhPgAMAAAAAAAAAA==/",
            "_etag": "\"02001fd6-0000-0000-0000-5a3df7cd0000\"",
            "_attachments": "attachments/",
            "_ts": 1514010573
        }
    ],
    "_count": 1
}

我通过REST api使用的查询是

{
    "query": "select * from root r where r.ipv4_src_addr='10.1.2.194' and r.id='SSL:lastHour' order by r.total_bytes desc",
    "parameters": []
} 

我在那里指定了一个分区键,包括字段IPV4_SRC_ADDR,但我不认为这实际上是一个分区集合。作为实验,我将查询更新为

SELECT
    concat(cast(L7_PROTO_NAME as nvarchar(max)), ':lastHour') as Id,
    System.timestamp as outputtime,
    groupid,
    L7_PROTO_NAME,
    sum(IN_BYTES + OUT_BYTES) as TOTAL_BYTES
INTO
    layer7sql
FROM
    NProbe TIMESTAMP BY [timestamp]
Group by groupid,
         L7_PROTO_NAME,
         slidingwindow(Minute,60)

到目前为止似乎工作得更好。我想知道是否有一些冲突需要一段时间才能解决,在那个时间窗口内,记录并不可见。

0 个答案:

没有答案