2009-05-03 2 views
2

Каковы преимущества и недостатки использования файла для межпроцессного взаимодействия? Позвольте мне рассказать о контексте, в котором я задаю этот вопрос.Связь между процессами

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

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

  1. Мы получаем постоянство бесплатно. В случае возникновения нового процесса возникают проблемы, когда мы не теряем какой-либо локальный трафик, когда мы пишем его в файловую систему. Пока потребитель знает, где он остановился, всякий раз, когда он появляется, он может начать обработку данных.
  2. Нет учебной кривой для использования библиотек очередей, ее обычного старого файла unix IO.
  3. Самый большой профессионал в том, что мы не затрагиваем текущий процесс производителя вообще, кроме нового потока для записи файлов.

Некоторые из проблем, с этим подходом являются: замок

  1. файла и сварливость и его влияние на производительность.
  2. Убедитесь, что буферы записи сброшены, и производитель только освобождает блокировку файла после того, как в файл было записано полное событие. Потребитель должен прочитать неполные записи.

Мысли? Является ли этот подход наивным и нужно ли нам просто заплатить первоначальные затраты на время нарастания времени для использования постоянной библиотеки очереди? Главное, что мы хотим иметь минимально возможное влияние на текущий процесс и не добавлять к нему никаких зависимостей.

ответ

1

Недавно я столкнулся с этим выбором и счел достаточно изучением о том, что Berkeley DB использует механизм очереди. Но в конечном итоге я решил вместо этого использовать файловую систему Unix, а написал свои собственные примитивы атомной очереди, используя Posix semaphores. Если все процессы находятся на одной машине, это довольно просто. Атомная функция put - около десятка строк кода; атомный get, потому что он должен ждать, если очередь пуста, примерно в три раза больше.

Мой совет, что вы спроектируете API-интерфейс атомной очереди, который скроет эти детали. (Классический пример следующего совета Parnas по использованию интерфейса, чтобы скрыть детали дизайна, которые могут измениться.) Вы можете сделать первую версию API, используя простой Unix-файл ввода-вывода. Затем вы можете попробовать варианты, такие как блокировка, Berkeley DB или семафоры --- все с «минимальным воздействием на текущий процесс».

Вы не будете знать о воздействии удара, пока не попробуете что-нибудь. Блокировка файлов на реальных файловых системах довольно хороша; блокировка файлов на NFS - это медведь.

Смежные вопросы