Как описано в akka docs, akka отправляет сообщения по принципу «выстрелил-забыл».
Но в шаблоне запроса, если ключ типа не существует, мне все равно нужно ждать ответа по тайм-ауту. Есть ли подход к отказу сразу при отправке сообщения на несуществующий typekey?
Я предполагаю, что под несуществующим ключом типа вы имеете в виду ключ типа, который не был передан init
.
При использовании типизированного сегментирования вы можете запросить локальный ActorRef
, возвращенный из ClusterSharding(actorSystem).shardState
, с помощью запроса GetShardRegionState(typeKey, _)
. Ответ CurrentShardRegionState
's shards
будет пустым, если typekey не был инициализирован (обратите внимание, что, поскольку это основано на классическом сегментировании кластера под капотом, технически это проверит только наличие typekey с этим инициализированным именем) на этом узле.
В классическом сегментировании набор имен typekey, которые были инициализированы на узле, может быть получен синхронно через ClusterSharding(actorSystem).shardTypeNames
.
Обратите внимание, что обычно рекомендуется инициализировать сегментирование для ключей всех типов очень рано в процессе запуска и упорядочивать запуск таким образом, чтобы функции, зависящие от сегментирования, не запускались до тех пор, пока не будут инициализированы все ключи типов. Например, можно запустить инициализацию сегментирования при формировании кластера, а затем (в том же обратном вызове) начать обслуживать HTTP-запросы или получать от брокера сообщений. Если он работает в Kubernetes, можно сразу связать HTTP, но определить проверку готовности, которая не станет зеленой, пока не будут инициализированы ключи типов сегментирования: тогда k8s не будет отправлять HTTP-трафик экземпляру, пока сегментирование не будет готово.
Если вы не можете быть уверены, что typekey инициализирован, вызовите на нем init
. Совместное использование кластера на самом деле не предназначено для этого гипердинамического варианта использования.
Существует команда GetClusterShardingStats
, которая является общекластерной для ключа типа (при условии, что она является локальной init
d (в противном случае она ответит пустым Map
).
Спасибо за ваш ответ. Что делать, если неправильный typekey , например, http-сервер перенаправляет все http-запросы на вызовы сущностей, ключи типов поступают из пользовательского ввода. И
GetShardRegionState
возвращает осколки только на текущем узле, но роль текущего узла не порождает объект для typekey, поэтому запрос ничего не вернул.