Corda FlowLogic Behavior в сценарии — какое значение имеют здесь потоки?

Я пытался понять фактический поток логики потока и сеансов.

Рассмотрим сценарий, в котором есть 3-сторонние узлы A, B и C. В самом начале A инициирует транзакцию с B, но B в это время не работает. Насколько я понимаю, он будет повторять попытки, пока B не вернется.

  • Может ли А инициировать другую транзакцию с С в этот момент времени?

  • Я читал, что Corda с открытым исходным кодом является однопоточным, тогда как предприятие является многопоточным. Значит ли это, что это меняет результат вышеприведенного сценария?

Я сделал несколько намеков на то, чтобы явно заставить поток и поток спать. Пожалуйста, пролейте свет сюда!


person Benjamin    schedule 01.10.2020    source источник


Ответы (1)


Корда с открытым исходным кодом:

  • Когда поток приостанавливается (когда он вызывает send(), receive(), sendAndReceive() или sleep()), один поток освобождается и может быть запущен другой поток.
  • Когда поток вызывает внешнюю операцию (например, вызовы HTTP, вызовы БД), этот вызов блокируется; это означает, что поток остается заблокированным потоком до тех пор, пока внешний вызов не завершится и поток не вернется. В этом случае вы не можете запустить другой поток.
  • Начиная с Corda 4.4, вы можете определять асинхронные потоковые операции (читайте об этом здесь), это помещает эти длительные операции в отдельный поток и приостанавливает поток; делая поток потока доступным для запуска других потоков.

Корда Энтерпрайз:

  • Как вы упомянули, он имеет несколько потоков потока. Таким образом, применяются те же пункты, что и выше, но у вас есть больше места для запуска других потоков в зависимости от того, сколько потоков потока доступно.
person Adel Rustum    schedule 01.10.2020
comment
Среди send() Receive() и sendAndReceive(). Разве только sendAndReceive не имеет функции приостановки? api.corda.net/api/corda-enterprise/4.3.1/html/api/kotlin/corda/ Потому что я прочитал здесь, что отправка не приостанавливается! Просто уточняю. - person Benjamin; 01.10.2020
comment
См. ответ здесь. - person Adel Rustum; 01.10.2020
comment
О... Тогда, могу ли я узнать, что это значит, говоря для Flowlogic.send в приведенной выше ссылке: ставит в очередь данные полезные данные для отправки другой стороне и продолжает без приостановки. Обратите внимание, что другая сторона может получить сообщение в какой-то произвольный более поздний момент или вообще не получить: если otherParty находится в автономном режиме, то доставка сообщения будет повторяться до тех пор, пока оно не вернется или пока сообщение не станет старше, чем время горизонта событий сети. В документации говорится, что он не будет приостановлен, но в другом посте, которым вы поделились, говорится, что он будет приостановлен!! - person Benjamin; 05.10.2020
comment
@BEN Я думаю, что вы правы, и в официальной документации есть противоречие, например, здесь упоминается, что все три функции (send(), receive() и sendAndReceive()) вызывают приостановку потока. Но я думаю, что документация по методу send(), которой вы поделились, является правильной. Это означает, что приостановка происходит только тогда, когда поток ожидает чего-то (т. е. вызывает receive() или sendAndReceive()). Я свяжусь с R3 для уточнения и опубликую обновление. - person Adel Rustum; 05.10.2020
comment
Согласно ответу от R3, send() вызывает приостановку только для создания контрольной точки, но она продолжается немедленно. - person Adel Rustum; 05.10.2020