Как указать роль на уровне узла в кластере Akka?

#java #scala #kubernetes #akka #akka-supervision

Вопрос:

Учитывая следующее приложение.conf :

 akka {
  loglevel = debug
  actor {
    provider = cluster

    serialization-bindings {
      "sample.cluster.CborSerializable" = jackson-cbor
    }
  }
  remote {
    artery {
      canonical.hostname = "127.0.0.1"
      canonical.port = 0
    }
  }
  cluster {
roles= ["testrole1" , "testrole2"]
    seed-nodes = [
      "akka://ClusterSystem@127.0.0.1:25251",
      "akka://ClusterSystem@127.0.0.1:25252"]
    downing-provider-class = "akka.cluster.sbr.SplitBrainResolverProvider"
  }
}
 

Чтобы различать роли внутри Актера, я использую :

 void register(Member member) {

if (member.hasRole("testrole1")) {
 //start actor a1
}
else if (member.hasRole("testrole2")) {
 //start actor a2
}
}
 

отредактировано из src (https://doc.akka.io/docs/akka/current/cluster-usage.html)

Чтобы включить роль для узла, я использую следующую конфигурацию :

В application.conf я настраиваю массив для ролей, но, похоже, это происходит на уровне кластера, а не на уровне узла. Другими словами, кажется невозможным настроить application. conf таким образом, чтобы кластер Akka получил указание запустить субъекта a1 на узле n1 и субъекта a2 на узле n2? Следует ли указывать детали примечания на уровне akka.cluster в application.conf ?

Требуется ли для каждого узла указывать несколько файлов конфигурации application.conf?

Например, application.conf для testrole1

 akka {
  loglevel = debug
  actor {
    provider = cluster

    serialization-bindings {
      "sample.cluster.CborSerializable" = jackson-cbor
    }
  }
  remote {
    artery {
      canonical.hostname = "127.0.0.1"
      canonical.port = 0
    }
  }
  cluster {
roles= ["testrole1"]
    seed-nodes = [
      "akka://ClusterSystem@127.0.0.1:25251",
      "akka://ClusterSystem@127.0.0.1:25252"]
    downing-provider-class = "akka.cluster.sbr.SplitBrainResolverProvider"
  }
}
 

application.conf for testrole2 :

 akka {
  loglevel = debug
  actor {
    provider = cluster

    serialization-bindings {
      "sample.cluster.CborSerializable" = jackson-cbor
    }
  }
  remote {
    artery {
      canonical.hostname = "127.0.0.1"
      canonical.port = 0
    }
  }
  cluster {
roles= ["testrole2"]
    seed-nodes = [
      "akka://ClusterSystem@127.0.0.1:25251",
      "akka://ClusterSystem@127.0.0.1:25252"]
    downing-provider-class = "akka.cluster.sbr.SplitBrainResolverProvider"
  }
}
 

The difference between each application.conf defined above is the value of akka.cluster.roles is either « testrole1" or "testrole2" .

Как следует настроить application.conf таким образом, чтобы кластер Akka получил указание запустить субъекта a1 на узле n1 и субъекта a2 на узле n2? Следует ли указывать сведения об узле на уровне akka.cluster в application.conf ?

Обновить:

Другой вариант-передать имя роли через переменную среды? Я только что заметил, что это прямо указано здесь: https://doc.akka.io/docs/akka/current/typed/cluster.html «Роли узлов определяются в свойстве конфигурации с именем akka.cluster.roles и обычно определяются в сценарии запуска как системное свойство или переменная среды». В этом сценарии используйте один и тот же файл application.conf для всех узлов, но каждый узел использует переменную среды. Например, обновленный файл appliction.conf (обратите внимание на добавление «ENV_VARIABLE»)

 akka {
  loglevel = debug
  actor {
    provider = cluster

    serialization-bindings {
      "sample.cluster.CborSerializable" = jackson-cbor
    }
  }
  remote {
    artery {
      canonical.hostname = "127.0.0.1"
      canonical.port = 0
    }
  }
  cluster {
roles= ["ENV_VARIABLE"]
    seed-nodes = [
      "akka://ClusterSystem@127.0.0.1:25251",
      "akka://ClusterSystem@127.0.0.1:25252"]
    downing-provider-class = "akka.cluster.sbr.SplitBrainResolverProvider"
  }
}
 

Сценарии запуска кластера определяют роль для каждого узла с помощью ENV_VARIABLE параметра, является ли это жизнеспособным решением?

Ответ №1:

Если вы собираетесь назначить разные роли разным узлам, эти узлы не смогут использовать одну и ту же конфигурацию. Самый простой способ сделать это-включить n1 "testRole1" в свой akka.cluster.roles список и n2 "testRole2" в свой akka.cluster.roles список.

Все в akka.cluster конфигурации настраивает только этот узел для участия в кластере (это настройка компонента кластера на этом узле). Некоторые настройки должны быть одинаковыми для всех узлов кластера (например, настройки SBR), но настройка n1 не влияет на настройку n2.

Комментарии:

1. спасибо, из вашего ответа следует, что вы предлагаете несколько файлов конфигурации application.conf? Пожалуйста, ознакомьтесь с обновлением вопроса.

2. Переменная env-это один из способов использования одного и того же application.conf разрешения файла в различных конфигурациях (включает в себя другой метод). Для этого вам следует проверить документы HOCON на наличие синтаксиса.