Azure Stream Analytics для концентратора событий очень медленный
Stream Analytics
работа занимает несколько минут, чтобы вывести результаты на Event Hub
,
Stateless Web API Azure Service Fabric
Приложение распределено по 8 узлам. Приложение очень простое, состоящее из одного Controller
, который:
- Получает серию
JSON
объекты - Инициализирует серию экземпляров EventData, которые обертывают каждый
JSON
объект - Устанавливает
PartitionKey
свойство каждого события EventData дляmachine-name
значение - Публикует
JSON
объекты в виде одной партииEventData
случаи кAzure Event Hub
JSON
Полезная нагрузка представляет собой простую серию IP addresses
а также time-stamps
, следующее:
[{
"IPAddress": "10.0.0.2",
"Time": "2016-08-17T12:00:01",
"MachineName": "MACHINE01"
}, {
"IPAddress": "10.0.0.3",
"Time": "2016-08-17T12:00:02",
"MachineName": "MACHINE01"
}]
После получения Event Hub
действует как вход в Stream Analytics
задание, которое выполняет следующее Query
:
SELECT
IPAddress, COUNT(*) AS Total, MachineName
INTO
Output
FROM
Input TIMESTAMP BY TIME
PARTITION BY PartitionId
GROUP BY
TUMBLINGWINDOW(MINUTE, 1), IPAddress, MachineName, PartitionId
HAVING Total >= 2
Обратите внимание, что Query
разделен на PartitionId
, где PartitionId
установлен на machine-name
происхождения Service Fabric
приложение. Поэтому будет максимум 8 PartitionKeys
Есть 8 человек Service Fabric
экземпляры и 8 соответствующих Partitions
назначен на вход Event Hub
,
Наконец, Stream Analytics
работа выводит результат на 2-й Event Hub
, Опять же это Event Hub
имеет 8 разделов. Stream Analytics
Query
сохраняет machine-name
, который используется в качестве PartitionKey
выход Event Hub
, Выходной формат JSON
,
В лучшем случае этот процесс занимает 30-60 секунд, а иногда и несколько минут, чтобы один HTTP-запрос достиг результата. Event Hub
, Узкое место, кажется, является Stream Analytics
работа, учитывая, что ASP.NET
Приложение публикует EventData
партии в подсекундных временных масштабах.
Редактировать:
Применение настраиваемого поля к Timestamp By
добавляет большую задержку, когда в сочетании с Group By
пункт. Я достиг приемлемой задержки (1-2 секунды) при удалении Timestamp By
пункт.
Оптимальный Query
как следует:
SELECT
Count(*) AS Total, IPAddress
FROM
Input
Partition by PartitionId
GROUP BY TUMBLINGWINDOW(MINUTE, 1), IPAddress, PartitionId
Тем не менее, добавив Having
предложение приводит к увеличению задержки до 10-20 секунд:
SELECT
Count(*) AS Total, IPAddress
FROM
Input
Partition by PartitionId
GROUP BY TUMBLINGWINDOW(MINUTE, 1), IPAddress, PartitionId
HAVING Total >= 10
Без возможности агрегировать данные в Query
, используя Having
пункт, своевременно, кажется, победить цель.
Между прочим, Streaming Units
, Partitions
, Input
а также Output
настроены оптимально, в соответствии с этим руководством для достижения параллелизма с Stream Analytics
,