Постоянство данных в C ++ - Предложите лучший подход - PullRequest
1 голос
/ 14 февраля 2011

Мы работаем над инструментом репликации, который периодически реплицирует разные папки с клиентского компьютера на серверный.

Когда необходимо реплицировать определенную папку, на стороне клиента создается реплицирующий объект (нашим сервисным модулем), который отправляет содержимое файлов, присутствующих в папке, по сети на сервер.На сервере создается соответствующий принимающий объект (наш сервисный модуль), который получает файлы.

Nutshell:

Абстракция на стороне клиента - объект репликации (работает в егособственный поток), чья ответственность заключается в отправке файлов.Серверная абстракция - получение объекта (работает в своем собственном потоке), ответственность за получение содержимого и создание / обновление файлов.

Теперь появилось дополнительное требование, когда нам нужны определенные счетчики, такие как общее количество отправленных байтов,общее количество полученных байтов, время последней репликации ... для каждой реплицируемой папки.Эти счетчики должны сохраняться до тех пор, пока наш сервис работает (нет необходимости сохранять это при перезагрузке нашего сервиса / машины).

Чтобы включить эти изменения, мы обсуждаем два подхода.

Обратите внимание - Счетчик необходимо поддерживать в течение циклов репликации.

Approach1 : повторное использование объекта

Сделать часть счетчиковрепликации, получение объектов и поддерживать объекты получения и репликации, пока служба жива.Теперь для потока можно использовать любой из следующих подходов:

  1. Поддерживать живой объект и поток (поток переходит в спящий режим).Теперь во время следующего цикла репликации объект и поток (пробуждают поток) используются повторно.

  2. Разрешить потоку выйти, сохранив реплицирующий, принимающий объект.Теперь во время следующего цикла тиражирования;репликация, получение объекта воссоздает поток или получает поток из пула потоков.

Approach2 : инкапсуляция

инкапсулирует счетчики вотдельный класс.Теперь каждый раз, когда создается / получает объект для репликации папки.Либо

  1. Передайте встречный объект, corr.в папку в качестве аргумента для конструктора получения / репликации объекта.

ИЛИ

  1. При получении / репликации объект запрашивает у диспетчера объект-счетчик, соответствующий папке.

Среди подходов1 и подход2 лучшеа почему?

1 Ответ

0 голосов
/ 14 февраля 2011

Я бы пошел на второй подход. Рассмотрим сценарий, в котором вы копируете более одного файла одновременно. Ваш текущий дизайн уже поддерживает это, просто создайте другой поток с его объектом репликации.

Если вы идете по второму маршруту, вы все равно можете оставить объект счетчика в основном потоке, получая сигналы от ваших рабочих потоков для обновления счетчиков. Однако первый подход не поддержит этот сценарий.

Другой сценарий: Просмотр в реальном времени. Если у вас есть графический интерфейс или что-то еще, что представляет текущую скорость передачи данных и т. Д., Он не должен запускаться в рабочем потоке. В любом случае вам придется сигнализировать потоку графического интерфейса. Подсчет в этом месте уже пригодится.

Подводя итог: мне кажется, что второй подход в вашем случае является более гибким. Это также тот, который вносит меньше изменений в текущий дизайн (вы все равно можете выбросить свои объекты, и у каждой репликации есть своя собственная парадигма объектов).

...