Как я могу иметь несколько контекстов для обработки событий в Apama

Я пытаюсь определить монитор, в котором я получаю события, а затем обрабатываю их в нескольких контекстах (примерно приравнивая к потокам, если я правильно понимаю). Я знаю, что могу написать

spawn myAction() to myNewContext; 

и это запустит это действие в новом контексте.

Однако я хочу иметь действие, которое будет реагировать на событие, когда оно появится на моем мониторе:

on all trigger() as t {
  doMyThing()
}

on all otherTrigger() as ot {
  doMyOtherThing()
}

Могу ли я определить свой on all с учетом конкретного контекста? Что-то вроде

on all trigger() as t in myContext {
  doMyThing()
}

on all otherTrigger() as t in myOtherContext {
  doMyOtherThing()
}

Если нет, то как лучше всего определить это в Apama EPL? Также могу ли я иметь несколько контекстов, обрабатывающих одни и те же события, когда они прибывают, в циклическом стиле?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

События Apama от внешних получателей (то есть из внешнего мира) доставляются только в контексты public, включая «основной» контекст. Таким образом, в зависимости от вашей архитектуры вы можете либо запустить свое действие в общедоступный контекст.

// set the receivesInput parameter to true to make this context public
spawn myAction() to context("myContext", true);

...

action myAction() {
    on all trigger() as t {
        doMyThing();
    }
}

или создайте свое действие в частном контексте и настройте перенаправитель событий в общедоступном контексте, обычно в основном контексте (который всегда будет существовать)

spawn myAction() to context("myNewContext");
on all trigger() as t {
    send t to "myChannel"; // forward all trigger events to the "myChannel" channel
}

...

action myAction() {
    monitor.subscribe("myChannel"); // receive all events delivered to the "myChannel" channel
    on all trigger() as t {
        doMyThing();
    }
}

Создание в частном контексте и использование системы каналов, как правило, является лучшим дизайном, поскольку он отправляет события только в те контексты, которые о них заботятся.

Чтобы немного расширить ответ Мэддена (у меня еще нет достаточного количества комментариев для комментариев), частный контекст и пересылки также являются единственным способом достижения истинного циклического перебора: в противном случае все контексты будут получать все события. Подход самый легкий заключается в использовании стратегии разделения (например, идентификаторы, заканчивающиеся на 0, переходят в контекст-0, или у вас есть один контекст для каждой машины, которую вы отслеживаете, и т. д.), Потому что тогда каждая проблема отслеживается в том же контексте, и вы не Не надо делиться государством.

Also could I have multiple contexts handling the same events when they arrive, round robin style?

Мне это не совсем понятно. Какие выгоды вы здесь преследуете? Если вы хотите уменьшить задержку за счет того, что «следующий доступный» контекст выбирает событие, это, вероятно, неправильный способ его достижения - решение о том, какой контекст обрабатывает событие, означает, что вам потребуются межконтекстные коммуникации и координация, что увеличит задержку. Если вы хотите, чтобы несколько контекстов обрабатывали одни и те же события (например, один контекст запускает ваше правило всплеска температуры, а другой - правило долгосрочного среднего значения температуры, но оба принимают значения температуры в качестве входных данных), то это хороший подход, но это не то, что я назвал бы круговой.

Привет, @ HenryLockwood, спасибо за ответ :) Вы были правы насчет того, что я хотел сделать, и я думаю, что я неправильно смотрел на контекст. Я понимаю вашу точку зрения об избежании синхронизации между контекстами (то, что я считал потоками), чтобы минимизировать задержку. Я думаю, что моя неопытность в Apama окрашивала то, как я пытался разработать монитор, и мне нужно взглянуть на это по-другому.

Caribou 28.09.2018 12:50

@Caribou - когда я был новичком в Apama, я очень рано думал о том, как сделать вещи быстрыми. Сейчас я старый и ленивый (!), Я просто пишу не глупый код, потом тестирую его на производительность и при необходимости настраиваю. Apama обычно достаточно быстра для большинства приложений, особенно если ваше требование к задержке измеряется десятками миллисекунд или дольше. Если вы взаимодействуете с другими компонентами, они будут как правило медленнее. В большинстве случаев контексты можно рассматривать как потоки - это хорошее рабочее приближение.

HenryLockwood 28.09.2018 13:21

Другие вопросы по теме