2016-02-17 3 views
0

Я использую симуляцию Gatling, которая объединяет HTTP-запросы с простыми пользовательскими действиями. Я вижу проблему, что иногда есть длинная (60 секунд) задержка между двумя последовательными действиями, которые должны быть выполнены мгновенным:Почему действие задерживается?

.exec(s => { 
    System.out.printf(/* logging time here */); 
    s 
    }) 
.exec(/* my custom action */) 

и я вхожу метку время в Chainable.execute() в моих пользовательских действиях. Это в основном работает, но некоторые исполнения задерживаются без какой-либо очевидной причины (и пользовательское действие терпит неудачу, поскольку оно должно быть выполнено менее чем через минуту после предыдущих действий).

Поскольку я новичок в актерах, есть ли способ отлаживать, где сообщение, чтобы продолжить действие следующего действия? Я думал, что последующее действие должно быть выполнено сразу же в одном потоке (поскольку ничто не должно блокировать это), но это, похоже, не так.

Система не застревает во время задержки; в то же время выполняются другие действия, и процессор не полностью используется.

ответ

1

Запах как блокирующий код, проверьте свои темы. И нет, у вас нет гарантии, что один и тот же поток используется для последовательных действий.

Если у вас есть блокирующий вызов в реализации Action, вы фактически блокируете один из потоков Akka, поэтому вы получаете головоломку потока, и ваш рабочий процесс теперь может продолжаться до тех пор, пока некоторые потоки не станут доступны снова.

НЕ БЛОКИРОВАТЬ В ТЕЧЕНИЕ. Если вы используете API блокировки (что в любом случае неверно), делегируйте его в выделенный пул потоков.

+0

Действие использует блокирующий код (вызовы внешнего API), но только после указанного журнала. Возможно ли, что действие не выполняется, поскольку выполняются другие экземпляры действия? –

+0

Ответ только что отредактирован. –

+0

Да, это помогло. Я думал, что, когда я вижу достаточно незанятых нитей akka, он должен работать, но, видимо, это сложнее. –

Смежные вопросы