Akka Cluster-Sharding выглядит так, как будто он хорошо подходит для использования. Мне нужно создать отдельные экземпляры постоянных участников с постоянным статусом через узлы Akka.Akka cluster-sharding: Can Entry артисты имеют динамические реквизиты
Непонятно, возможно ли иметь тип участника входа, для которого требуются аргументы для его создания. Или, может быть, мне нужно пересмотреть, как входной актер получает эту информацию.
Object Account {
def apply(region: String, accountId: String): Props = Props(new Account(region, accountId))
}
class Account(val region: String, val accountId: String) extends Actor with PersistentActor { ... }
В то время как ClusterSharding.start
занимает в единственном экземпляре реквизита для создания всех участников записи.
val counterRegion: ActorRef = ClusterSharding(system).start(
typeName = "Counter",
entryProps = Some(Props[Counter]),
idExtractor = idExtractor,
shardResolver = shardResolver)
И тогда он решает ввода актер, который получает сообщение основано на том, как вы определяете idExtractor. Из исходного кода осколка можно видеть его использует идентификатор в качестве имени для данного экземпляра записи актера:
def getEntry(id: EntryId): ActorRef = {
val name = URLEncoder.encode(id, "utf-8")
context.child(name).getOrElse {
log.debug("Starting entry [{}] in shard [{}]", id, shardId)
val a = context.watch(context.actorOf(entryProps, name))
idByRef = idByRef.updated(a, id)
refById = refById.updated(id, a)
state = state.copy(state.entries + id)
a
}
}
Кажется, я вместо того, чтобы иметь мою запись актер фигуру из своего региона и accountId по имени, которое оно дано, хотя теперь это немного взломанно, и я буду разбирать его из строки вместо прямого получения значений. Это мой лучший вариант?
Спасибо за идеи. В качестве прямого ответа на первую часть вопроса, который мы подразумеваем, встроенный способ ClusterSharding не поддерживает встроенный динамический реквизит. Итак, чтобы контекстуализировать ваш ответ как относящийся к моему следующему вопросу о «это мой лучший вариант?» Который я считаю, что вы хорошо ответили. – Rich
Да, я не был уверен, было ли лучше удалить его полностью или пометить его как нерабочее, чтобы кто-то из akka заберет его * wink wink * (или, по крайней мере, люди будут знать, что это не вариант и не будет тратить время пытается это). Кроме того, возможно, было бы возможно получить что-то с Guice и взломать InjectedProps, я где-то видел что-то подобное, к сожалению, я не помню деталей. –