docs предлагает:
RunAsync
метод реализован как цикл обработки и будет вызываться только тогда, когда реплика является первичной с состоянием записи.
Но что не ясно, так это то, что RunAsync()
вызывается не только при запуске, также вызывается при событии ChangeRole
, когда реплика Secondary повышается до Primary .
Технически, он вызывается один раз при запуске, когда реплика становится первичной, и если по какой-либо причине она понижается до вторичной по событию ChangeRole
, а затем снова повышается до основной, она будет вызываться снова, каждый раз токен отмены будет отменен для распространения изменений до новых вызовов.
Итак, в общем, он часто вызывается один раз, но не следует ожидать, что он будет вызываться несколько раз, и это будет проблемой, если логика там всегда будет запускаться один раз.
Другой распространенной проблемой является то, что CreateServiceReplicaListeners()
также может вызываться несколько раз по тем же причинам, что и выше, но это может быть гораздо более серьезной проблемой, поскольку вторичные реплики также вызывают CreateServiceReplicaListeners()
, распространенной ошибкой является добавление логики.при условии, что он вызывается только один раз.
Документы здесь и здесь показывают более подробную информацию о проблемах со сценарием выше.
Это - исходный файл для большей части логики, описанной выше.