Безопасность выполнения утверждений в отдельном контексте выполнения - PullRequest
1 голос
/ 18 мая 2019

Насколько изолированы разные контексты выполнения друг от друга? Скажем, у нас есть два контекста выполнения ec1 и ec2, оба используются в одном и том же пути кода, реализуя некоторое путешествие пользователя. Если, скажем, в ec2 начнутся голодания и сбои, останется ли ec1 неизменным?

Например, рассмотрим следующий сценарий, в котором мы хотим убедиться, что с пользователя была снята плата только один раз, запустив утверждение внутри Future

chargeUserF andThen { case _ => 
  getNumberOfChargesF map { num => assert(num == 0) }
    .andThen { case Failure(e) => logger.error("User charged more than once! Fix ASAP!", e)  } 
}

Здесь getNumberOfChargesF не является обязательным для выполнения запроса пользователя, это просто побочная проблема, когда мы утверждаем ожидаемое состояние базы данных после того, как она была мутирована chargeUserF. Поскольку нет необходимости, мне неловко добавлять его в основную бизнес-логику из-за страха, что это может каким-то образом нарушить основную логику. Если я запускаю getNumberOfChargesF в контексте выполнения, отличном от используемого chargeUserF, могу ли я предположить, что такие проблемы, как голодание, блокировка и т. Д., Вызванные getNumberOfChargesF, не повлияют на основную бизнес-логику?

1 Ответ

2 голосов
/ 18 мая 2019

Каждый контекст выполнения имеет свой собственный пул потоков, так что, да ... вроде. Они «независимы» в том смысле, что если в одном из них заканчиваются потоки, другой может продолжать работать, однако они используют один и тот же ресурс (ЦП), поэтому, если один из них будет максимизирован, другой, очевидно, будет пострадавшие.

На них также влияют побочные эффекты друг друга. Например, как написан ваш код, chargeUser и getNumberOfCharges происходят параллельно, и никто не может сказать, какой из них закончится первым, поэтому, если я угадываю семантику правильно, количество зарядов может закончиться либо 0, либо 1 довольно случайно, в зависимости от того, завершилось или нет предыдущее будущее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...