2015-04-11 3 views
2

Я играю с недавно выпущенным Akka.Net 1.0 (поздравляю с релизом!), Поэтому для меня это совсем не ново, но я уверен, что кто-нибудь с опытом JVM Akka может также перезвонить поскольку в этом вопросе нет ничего, зависящего от времени выполнения.Перекрестные звонки с Akka

Рассмотрим несколько (для примера, 2) отдельных сервисов, которые являются частью более крупной системы/приложения. Эти услуги обычно выполняют свои собственные действия, но иногда необходимы перекрестные звонки. Предположим, что Service 2 может быть автономным и имеет действие GetStuff. Service 1 имеет действие DoSomething, которое должно получить результат GetStuff действий первым.

Каков предпочтительный способ обработки такой ситуации, когда обе службы могут быть развернуты отдельно и на разных машинах?

Как я уже сказал, я много о Акку не знаю, но копаться в примерах, документы и источник я нашел два варианта:

  1. Remoting. Отдельные актерские системы в своих собственных службах используют Remoting для получения ActorSelection с удаленного хоста. Это было бы почти то же самое, что и Remoting docs example, только две актерские системы были бы равны «клиентам».
  2. Кластеризация. Я пытаюсь обернуть голову вокруг, и теперь я могу понять, как настроить отдельную кластерную службу, которая просто установила бы систему кластеров, создав простой исполнитель-слушатель, чтобы узел семени мог быть правильно инициализирован (?). Затем каждая отдельная актерская система, созданная в своих собственных службах, присоединяется к упомянутой кластерной системе под другой ролью.

Возможно, есть еще одно решение, о котором я не знаю ...?

Лично кластерное решение кажется сложнее понять и настроить на первый взгляд, но, возможно, есть некоторые существенные преимущества, которые я не вижу прямо сейчас.

Чтобы повторить, что является предпочтительным способом обработки такой ситуации и на что я должен обратить внимание?

ответ

1

Akka.Cluster зависит от Akka.Remote - вот что принципиально отличается о них:

  • Akka.Remote - позволяет подключать и общаться с системами, работающими в актерских удаленных процессов. Могут быть полностью отдельные кодовые базы, которые запускают совершенно разные приложения Akka.NET («службы», если хотите). Все, что вам нужно для связи между двумя системами, - это общий набор классов сообщений, которые видны в обоих процессах.
  • Akka.Cluster - абстракция поверх Akka.Remote, которая устраняет необходимость того, чтобы каждый из ваших экземпляров службы должен был знать явный адрес любого другого возможного экземпляра службы, к которому может потребоваться подключение. Это могут быть экземпляры одних и тех же сервисов или экземпляров разных служб. Обеспечивает динамическое обнаружение сервисов с помощью действительно простой стратегии «семенного узла».

Я рекомендую вам взглянуть на Akka.Cluster microservices example, что я написал - это показывает, как можно использовать Akka.Cluster «роль», чтобы динамически сделать кросс-служба вызовов узлов в другой службе без явного определить любой из их сетевых адресов. В частности, взгляните на то, как я использую «кластерные» маршрутизаторы для этого.

+0

Спасибо! Это почти идеально, очень близко к тому, что я хочу, хотя это немного сложно. Во всяком случае, кажется, что все работает нормально, даже если мое собственное приложение-образец на основе этого не работает :) Я предполагаю, что у меня что-то не получается, мне придется все разобраться, есть много чего, Здесь пока что. Из всего, что я собираю, что Clustering должен быть стандартным способом подхода к этой проблеме, спасибо! –

+0

Быстрый и маленький вопрос. Я попытался сузить свою проблему с «неработоспособной», и у меня довольно небольшой и автономный пример, когда вызов выбора актера из другого процесса ничего не делает (но работает из одного и того же процесса) - где было бы лучше всего связать репо, чтобы я мог спросить, как настроить кластер? Я попытался адаптировать конфигурацию из примера, который вы дали, но пока немного «слишком много» ... :) –

Смежные вопросы