Я, правда, давно не пользуюсь Akka, но вижу несколько возможностей для улучшения.
Во-первых, вы объединяете в цепочку запросы "аск", которые блокируют потоки.В некоторых случаях это неизбежно, но я думаю, что в вашем случае этого можно избежать.Когда вы блокируете потоки, вы потенциально ухудшаете свою пропускную способность.
Я бы хотел, чтобы конечная точка отправляла сообщение со своим ActorRef в качестве поля для ответа.Таким образом, вам не нужно блокировать актеров Endpoint и JobSupervisor.Всякий раз, когда актер репозитория завершает операцию, он может отправить ответ напрямую в конечную точку без необходимости проходить через посредников.
В зависимости от ваших гарантийных требований к обмену сообщениями конечная точка может при необходимости выполнить повторную попытку и дедупликацию.
В идеале каждый участник должен иметь все необходимое для обработки сообщения в сообщении.Я не уверен, что включает ваш RequestContext, но я бы подумал:
1) Трудно ли его создать?Это влияет на тестируемость.Если RequestContext сложно создать, я бы выбрал для извлечения только необходимые элементы, чтобы можно было писать модульные тесты.
2) Можно ли его сериализовать?Если вы развернете свою актерскую систему в кластерной среде, вам нужно будет сериализовать сообщения.Сообщения, которые являются простыми держателями данных, работают лучше всего.