Это может быть хорошим вариантом использования для Durable Entities (более новая функция Durable Functions). Идентификатор вашей сущности может быть получен из идентификатора в вашем информационном наполнении события. С помощью функции триггера EventHub вы можете отправлять сигнал определенному объекту каждый раз, когда видите шаблон, который ищете. Надежный объект будет создан автоматически при поступлении первого события и может просто подсчитать количество событий, прежде чем предпринимать какие-либо действия.
Например, вот триггерная функция концентратора событий:
[FunctionName("ProcessEvents")]
public static async Task ProcessEvents(
[EventHubTrigger("event-source")] EventData input,
[DurableClient] IDurableClient client)
{
if (IsOfInterest(input))
{
var id = new EntityId("MyDetector", (string)input.Properties["ID"]);
await client.SignalEntityAsync(id, nameof(MyDetector.Process), input);
}
// ...
}
... а вот функция сущности (реализованная как . NET класс ):
[JsonObject(MemberSerialization.OptIn)]
public class MyDetector
{
[JsonProperty]
public int CurrentEventCount { get; set; }
public void Process(EventData input)
{
// Take some action if this event happens N or more times
if (++this.CurrentEventCount >= 10)
{
TakeSomeAction(input);
// reset the counter
this.CurrentEventCount = 0;
}
}
[FunctionName(nameof(MyDetector))]
public static Task Run([EntityTrigger] IDurableEntityContext ctx)
=> ctx.DispatchAsync<MyDetector>();
}