Асинхронная распределенная передача файлов - PullRequest
2 голосов
/ 02 июля 2010

Мне нужно построить систему, в которой у нас есть набор машин, производящих уникальные файлы, давайте называть их ПРОИЗВОДИТЕЛЯМИ, а набор машин получает эти файлы, которые мы называем ПОТРЕБИТЕЛЯМИ. Любая машина от ПРОИЗВОДИТЕЛЕЙ может отправлять файлы одному или нескольким ПОТРЕБИТЕЛЯМ [на основе какого-то хеш-механизма]. Мне нужно создать механизм, который гарантирует, что доставка файлов происходит гарантированным образом. то есть производители или потребители могут потерпеть крах / перезагрузку и иметь возможность продолжить с того места, где они остановились. Есть ли надежный масштабируемый способ реализовать это, кажется, что это довольно распространенная потребность в любой отказоустойчивой системе? Ожидается, что число производителей и потребителей будет увеличиваться / уменьшаться на лету.

Ответы [ 2 ]

1 голос
/ 02 июля 2010

То, что вы описываете, немного похоже на механизм репликации Google File System архитектуры.Вы будете наиболее заинтересованы в разделах 3.1 и 3.2 документа вместе с иллюстрацией на рисунке 2.

Краткое изложение (с упрощениями) применительно к вашему случаю:

  1. ПРОИЗВОДИТЕЛЬ отправляет данные, ожидает ответа.
  2. ПОТРЕБИТЕЛЬ (s) ответ: «Я получил все данные».
  3. PRODUCER отправляет команду «завершить запись», ожидает ответа.
  4. CONSUMER (s) отвечают: «Я сбросил данные на диск».
  5. Теперь (и только сейчас) рассматриваем данные как «сохраненные».

GFS, как описано в документе, реализует ряд оптимизаций, включая конвейеризацию записи для потребителей вместо разделения одной машины.пропускная способность одновременно на n машинах.

Чтобы повысить гарантии безопасности при сбоях, вы можете сделать операции записи идемпотентными, используя Intent Log .Это может быть либо только в конце производителя (например, повторная попытка после истечения времени ожидания), либо в конце потребителя (при перезагрузке продолжить работу).

0 голосов
/ 02 июля 2010

То, что вы описываете, вероятно, легче всего реализовать, используя некоторую форму передачи сообщений.Возможно, вы захотите взглянуть на http://www.zeromq.org; Я сам работал с этой библиотекой и могу от всей души порекомендовать ее.

С другой стороны: если вам не нужно использовать C ++, вам может пригодиться Erlang .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...