Можно ли создать долговременную функцию оркестровки, которая может запускаться из нескольких событий из EventHub? - PullRequest
1 голос
/ 09 февраля 2020

Я полагаю, что вопрос похож на Могут ли долговременные функции иметь несколько триггеров? , но я не пытаюсь использовать несколько триггеров как таковых.

Мой пример использования: у меня есть EventHub, который запускает долговременную функцию. Я хотел бы прослушать N-е событие, содержащее указанный шаблон c в полезной нагрузке для указанного c идентификатора (также в полезной нагрузке)

При получении n-го события я могу легко запустить другое активность, но что я могу выяснить, это как сделать бит состояния с самого начала?

Если долговременные функции не могут это поддерживать, какие еще опции есть в Azure, так что делать что-то подобное?

event       id      event name
1           1       login
2           1       navigate
3           2       login
4           2       do something
5           1       do something of interest
6           1       do something of interest (again, this is what I was to trigger the activity on)

Эта информация в настоящее время поступает из концентратора событий и запускает мою функцию.

1 Ответ

1 голос
/ 25 февраля 2020

Это может быть хорошим вариантом использования для 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>();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...