Когда вы работаете с ReliableCollections
, каждая операция (т.е. AddAsync
) выполняет следующие действия:
- Обновляет
ITransaction
локальное хранилище (для предоставления read-your-own-writes semantics
) - Сериализует значения и обновляет локальный журнал операций (сохраняется).
- Отправьте эти байты во все вторичные реплики, чтобы убедиться, что они имеют одинаковую информацию.
Тогда, когда ITransaction
подтверждено, запись commit
добавляется в журнал и отправляется во все вторичные реплики.В тот момент, когда quorum
подтверждает фиксацию, операция считается выполненной (см. здесь для получения дополнительной информации).
Таким образом, в целом информация все время сериализуется.
Причина, по которой вы увидели «правильные» результаты, заключается в том, что большую часть времени вы работаете с одной и той же репликой - первичная реплика (это сделано потому, что только первичная реплика может изменять состояние) ивсе операции чтения / записи из одной и той же реплики возвращали правильных значений.
Хитрость в том, что Service Fabric может перемещать реплики между узлами, т. е. представьте, что ваша основная реплика была на Node1
.Все ваши операции чтения и записи были в порядке, но затем Service Fabric решила переместить вашу основную реплику на Node2
- это приводит к новой простой реплике на Node2
, которая получает initialized
путем передачи сериализованных данных в нее.Когда реплика инициализируется, реплика на Node1
понижается, а реплика на Node2
повышается.Теперь все ваши запросы относятся к серверу Node2
, а не Node1
(см. здесь и здесь для получения дополнительной информации о жизненном цикле службы и реплики).