Переслать сообщение следующему маршруту Round Robin

У меня есть это приложение Play, которое подключается к удаленному серверу, чтобы использовать данный API. Чтобы сбалансировать нагрузку моих запросов к удаленному серверу, я подключаю несколько учетных записей к тому же серверу. Каждая учетная запись может запрашивать API заданное количество раз. Каждая учетная запись обрабатывается субъектом Akka, и эти субъекты находятся за маршрутизатором Akka Round Robin. Таким образом, когда я хочу использовать удаленный API, я «запрашиваю» у маршрутизатора RR нужную информацию.

Эта реализация работает нормально, пока одна учетная запись не будет отключена. По сути, когда одна учетная запись отключена, актор возвращает заданный объект, который говорит, что «что-то не так с подключением», а затем я снова отправляю второй запрос на маршрутизатор RR для обработки другой учетной записью.

Мой вопрос: вместо того, чтобы иметь логику «повторить попытку» вне группы маршрутизатора-маршрутизатора, есть ли способ сделать это внутри? Я думаю, что, например, на уровне маршрутизатора определите логику, которая обрабатывает эти сообщения «что-то не так с соединением», автоматически перенаправляя запрос следующему маршруту для его обработки, и возвращайте окончательный ответ только после того, как все маршруты будут пробовали и ничего не помогло?

Предоставляет ли Akka простой способ добиться этого, или я должен просто продолжить свою реализацию?


person Peter    schedule 22.06.2014    source источник
comment
Почему у вас есть несколько учетных записей с этим API? Вы пытаетесь обойти лимит соединения или запроса?   -  person wingedsubmariner    schedule 23.06.2014
comment
да. В дополнение к кэшированию мне было предоставлено несколько учетных записей для использования.   -  person Peter    schedule 23.06.2014


Ответы (1)


Я не уверен, что полностью понимаю ваш дизайн, но я думаю, вам следует попробовать использовать первую полную модель, поддерживаемую логикой маршрутизации ScatterGatherFirstCompleted.

router.type-mapping {
  ...
  scatter-gather-pool = "akka.routing.ScatterGatherFirstCompletedPool"
  scatter-gather-group = "akka.routing.ScatterGatherFirstCompletedGroup"
  ..
}

в простой форме

                  ---> Route
       --> SGFC-1 
RR ->  

или, возможно, в сочетании с циклическим маршрутизатором.

                  ---> Route
       --> SGFC-1 
RR ->
       --> SGFC-2
                  ---> Route

Так же, как и в вашем предложении, соединения представлены маршрутами. SGFC-1 и SGFC-2 должны иметь доступ к одному и тому же пулу маршрутов (соединений) или части пула.

person hicolour    schedule 24.11.2014