我有一个非常标准的设置
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保持不变。这些是我的输出设置
当我查询时,我会回来
{
"_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)
到目前为止似乎工作得更好。我想知道是否有一些冲突需要一段时间才能解决,在那个时间窗口内,记录并不可见。