Q>
Как определить точки в коде, которые должны выполняться атомарно «автоматически»?
A>
В любое время, когда в разных контекстах есть что-то общее (не обязательно, чтобы все стороны были мутаторами, достаточно хотя бы одного). В вашем случае balance
используется несколькими агентами.
Q>
ЕСЛИ во время выполнения происходит сбой кода, насколько поможет «регистрация транзакции и значений переменных»? Существуют ли другие подходы к решению проблемы сбойных агентов?
A>
Это может помочь, но к нему прилагаются большие расходы. Вам необходимо откатить X записей, воспроизвести сценарий и т. Д. Лучший подход - сделать его полностью транзакционным или иметь эффективный сценарий автоматического отката .
Q>
Опять же, регистрация не масштабируется для больших приложений с большим количеством переменных. Что мы можем в таком случае - вместо возобновления выполнения с нуля?
A>
В некоторых случаях вы можете расслабить последовательность. Например, CopyOnWriteArrayList выполняет одновременную запись и включает данные для новых считывателей после того, как они становятся доступными. Если запись не удалась, она может безопасно отбросить эти данные. Там также сравните и поменяйте местами . Также смотрите ссылку на предыдущий вопрос.
Q>
В общем, как можно идентифицировать такие атомные блоки в случае агентов, которые работают вместе.
A>
См. Ваш первый вопрос.
Q>
Если один агент выходит из строя, другие должны ждать его перезапуска?
A>
Большинство политик / API определяют максимальное время ожидания для выполнения критической секции, в противном случае система может оказаться в бесконечном тупике.
Q>
Как тестирование программного обеспечения может помочь нам в выявлении потенциальных случаев, когда при сбое агента наблюдается несовместимое состояние программы.
A>
Это может в значительной степени. Однако для тестирования параллельного кода требуется столько же навыков, сколько и для написания самого кода, если не больше.
Q>
Как сделать атомные блоки более мелкозернистыми, чтобы уменьшить узкие места в производительности?
A>
Вы сами ответили на вопрос :) Если для одной атомарной операции требуется изменить 10 различных переменных общего состояния, вы ничего не можете сделать, кроме попытки отодвинуть внешний контракт вниз, поэтому ему нужно изменить больше. Это в значительной степени причина того, что базы данных не так масштабируемы, как хранилища NoSQL - им может потребоваться изменить внешние ключи, выполнить триггеры и т. Д. Или попытаться обеспечить неизменность.
Если бы вы были программистом на Java, я бы определенно рекомендовал прочитать эту книгу . Я уверен, что есть и хорошие аналоги для других языков.