Как и любая система, которая может стать несовместимой, вы должны разрешить патчи применять как можно быстрее, если вы хотите скорее поймать конфликты и уменьшить вероятность их столкновения. Вероятно, это ваш основной вопрос, если вы не уведомите других клиентов о любых обновленных данных как можно скорее (и просто ожидаете, что CRON будет запущен для обновления общих данных, к которым могут обращаться другие клиенты).
Как и другие люди, важно понять, как «плохой» патч попал в очередь операций в первую очередь. Вот некоторые догадки с моей точки зрения:
- Пользователь применил некоторые операции, которые были потеряны при переводе. Как? Я не знаю, но это объясняет несоответствие.
- Операции не применяются в правильном порядке. Как? Я не знаю. У меня нет кода, чтобы уйти.
Хотя у меня нет кода, чтобы уйти, я могу сделать снимок в темноте и помочь вам проанализировать последний момент. Первое, что нам нужно проанализировать, это различные сценарии, которые могут возникнуть при обновлении «общего» ресурса. Важно отметить, что в любой системе, которая должна быть в конечном итоге последовательной, мы заботимся о:
- Порядок операций.
- Как мы будем иметь дело с конфликтами.
Последнее действительно зависит от вас, и вам понадобится хорошая система уведомлений/сообщений, чтобы обновить «правду», которую видят клиенты.
Сценарий 1
Пользователь A применяет операции 1 & 2. Документ обновляется на сервере, а затем пользователь B получает уведомление об этом. Пользователь B будет применять операции 3 & 4, но эти операции (в этом порядке) не конфликтуют с операциями 1 & 2. Все хорошо в мире. Это хорошая ситуация.
Сценарий 2
Пользователь A применяет операции 1 & 2. Пользователь B применяет операции 3 & 4.
Если применить операции атомарно для каждого пользователя, вы можете получить следующие очереди:
[1,2,3,4] [3,4,1,2]
В любом случае вдоль линии, если есть конфликт, вы должны уведомить пользователя A или пользователя B на основе «кто первым попал туда», (или любой другой весовой семант ics, который вы хотите использовать). Опять же, как вы справляетесь с конфликтами, зависит от вас. Если вы не читали на векторных часах, вы должны это сделать.
Если вы не применять операции атомарно для каждого пользователя, вы можете получить следующие очереди:
[1,2,3,4] [3,4,1,2] [1,3,2 , 4] [3,1,4,2] [3,1,2,4] [1,3,4,2]
Как вы можете видеть, исходящие атомные обновления для каждого пользователя увеличивают комбинации обновлений и поэтому увеличение вероятность столкновения происходит. Я настоятельно призываю вас обеспечить автоматическое добавление операций в очередь для каждого пользователя.
повторение
Некоторые важные вещи, которые вы должны помнить:
- Убедитесь, что обновления в очереди атомарно применяется для каждого пользователя.
- Выясните, как вы будете иметь дело с несколькими версиями общего ресурса, возникающими из-за множественных мутаций от разных клиентов (опять же я предлагаю вам читать на векторных часах).
- Не обновляйте общий ресурс, к которому могут обращаться несколько клиентов в режиме реального времени в качестве задания cron.
- Когда есть конфликт, который не может быть разрешен, выясните, как вы с этим справитесь.
- В результате пункта 3 вам потребуется создать систему уведомлений, чтобы клиенты могли быстро получать обновленные ресурсы. В результате пункта 4 вы можете указать, чтобы сообщить клиентам, что что-то пошло не так с их обновлением. Что-то, что только что пришло мне в голову, это то, что вы уже используете Redis, у которого есть возможности pub/sub.
EDIT:
Похоже, Google Docs обрабатывает разрешения конфликтов с преобразованиями.То есть, переместив целые символы/линии, чтобы освободить место для гибридного применения всех операций: https://drive.googleblog.com/2010/09/whats-different-about-new-google-docs_22.html
Как я уже говорил, все зависит от того, как вы хотите справиться со своими собственными конфликтами, что в значительной степени должно быть определено самим приложением/продуктом и его вариантами использования.
на высоком уровне, что бы вы предпочли, чтобы произойти в случае искаженного разлома? вы хотите попытаться исправить проблему или просто выбросить diff? – aembke
Как пользователь создает плохой патч? – zenbeni
Я не знаю. Мне нужно как-то предотвратить испорченный diff. Может быть, есть лучшие практики? – Erik