Есть ли способ сохранить согласованность данных между модулями?

Обычно, если у нас много ресурсов, принадлежащих одному модулю и измененных многими потоками, и мы хотим сохранить согласованность данных между этими потоками, один из способов сделать это — использовать блокировки.

Но это кажется невозможным, когда ресурсы распределены по нескольким модулям. Например, предположим, у нас есть три модуля, они SocketsLayer, SessionLayer, FileTransferLayer. И некоторые другие предположения:

  1. SocketsLayer
    Поддерживать все (неблокирующие) розетки;
    Используйте один поток, чтобы слушать и читать из сокетов;
    Используйте ту же ветку для удаления сокетов при закрытии и уведомления сеансовый уровень асинхронно.

  2. сеансовый уровень
    Создать сеанс для каждого пользователя;
    У каждого пользователя есть один сокет с именем CmdChannel для команд send / recv;
    У каждого пользователя есть несколько сокетов, называемых DataChannel для отправки / получения данных из файла;
    Каждый (имя пользователя, сокет cmd, сокеты данных) называется сессия.
    Как только сокет зарегистрирован как CmdChannel для USER, создается сессия для этого пользователя.
    Как только CmdChannel закрывается или прерывается, сеанс, которому он принадлежит, становится недействительным (BE DELETED).
    Как только сеанс стал недействительным, все сокеты данных стали недействительными.
    Используйте один поток, чтобы создать сеанс и удалить сеанс.

  3. FileTransferLayer
    У каждого пользователя есть несколько задач передачи файлов;
    Каждая задача передачи файлов имеет свой собственный сокет данных;
    Все задачи принадлежат одному пользователю с общим командным сокетом;
    Как только сеанс пользователя стал недействительным, задачи, принадлежащие этому пользователю, должны быть удалены.
    Используйте один поток для создания задач и удаления задач.

Предположим, что один канал CMD регистрируется для SomeUser (обрабатывается сеансовый уровень), сейчас сеансовый уровень собирается создать сессия для этого пользователя. Но что, если этот сокет cmd закрыт пэром в течение периода сессия создается?

ОБНОВИТЬ
Розетки в SocketsLayer а также сессия в сеансовый уровень а также задачи в FileTransferLayer, Все эти три типа данных принадлежат одному и тому же пользователю и должны быть согласованными. Но они принадлежат разным модулям, так как сохранить согласованность данных между этими тремя модулями?

1

Решение

Задача ещё не решена.

Другие решения