Arhn - архитектура программирования

Каков наиболее эффективный способ потоковой передачи данных между контейнерами Docker

У меня есть большое количество байтов в секунду, поступающих с сенсорного устройства (например, видео), которые считываются и обрабатываются процессом в контейнере Docker.

У меня есть второй контейнер Docker, который хотел бы прочитать обработанный поток байтов (все еще большое количество байтов в секунду).

Как лучше всего читать этот поток? В идеале я бы хотел, чтобы первый контейнер записывал в какой-то буфер общей памяти, из которого второй контейнер может читать, но я не думаю, что отдельные контейнеры Docker могут совместно использовать память. Возможно, есть какое-то решение с указателем общего файла, когда файл сохраняется в файловой системе в памяти?

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

Изменить: хотелось бы иметь решения как для Linux, так и для Windows. Точно так же я заинтересован в поиске решений для этого как на C ++, так и на python.


Ответы:


1

Создайте фифо с mkfifo /tmp/myfifo. Поделиться с обоими контейнерами: --volume /tmp/myfifo:/tmp/myfifo:rw

Вы можете напрямую использовать его:

  • Из контейнера 1: echo foo >>/tmp/myfifo

  • В контейнере 2: read var </tmp/myfifo

Недостаток: контейнер 1 заблокирован до тех пор, пока контейнер 2 не прочитает данные и не очистит буфер.

Избегайте блокировки: в обоих контейнерах запустите bash exec 3<>/tmp/myfifo.

  • Из контейнера 1: echo foo >&3

  • В контейнере 2: read var <&3 (или, например, cat <&3)

В этом решении используется exec обработка файловых дескрипторов из bash. Не знаю как, но, конечно, это возможно и с другими языками.

12.07.2018
  • Звучит многообещающе, спасибо! Я хотел бы выяснить, как это сделать с помощью Python или C ++, а также хотел бы получить решение для Windows (обновил свой вопрос с дополнительными деталями). Тем не менее, это отличное место для начала. 12.07.2018
  • @eraoul По крайней мере, с MSYS2 в Windows у меня были проблемы с объединением mkfifo с exec: github.com/ Alexpux / MSYS2-пакеты / issues / 1333. Использование только mkfifo или exec работает в MSYS2. 12.07.2018
  • @eraoul См. также ссылки об именованных каналах в Windows в этом комментарии: github.com/ mviereck / x11docker / issues / 55 # issuecomment-403859010 12.07.2018
  • @mviereck что делать, если есть несколько потоков? Придется переопределить все тома для? Я также использую динамические потоки. Есть еще хак? 22.02.2019
  • @SleebaPaul Для нескольких (и динамических) потоков я бы порекомендовал поделиться папкой вместо одного фифо. Создавайте / удаляйте фифо в этой папке по мере необходимости, они будут доступны во всех контейнерах, использующих эту папку. 23.02.2019
  • @mviereck Мой вариант использования также включает несколько слушателей. Я установил вышеупомянутое решение, и каналы хорошо взаимодействуют только между двумя процессами. Можем ли мы масштабировать подход до нескольких слушателей? 25.02.2019
  • @SleebaPaul Unix-каналы обычно работают только с одним слушателем. Либо сохраните данные в файлах, чтобы разрешить доступ для других процессов, либо спросите / выполните поиск в целом о том, как совместно использовать каналы с другими процессами. 25.02.2019

  • 2

    Мой первый выбор - использовать простой TCP-сокет. Только в том случае, если измерения покажут, что нам абсолютно необходимо выжать из системы последний бит производительности, к которому я бы вернулся, или к конвейеру, или к разделяемой памяти.

    Исходя из постановки задачи, кажется, что процесс связан с локальными ресурсами ЦП / памяти и ограничивающими факторами не являются внешние службы. В этом случае наличие как производителя, так и потребителя на одной машине (в качестве контейнеров докеров) может ограничить ресурс ЦП прежде всего - НО я сначала измерю, прежде чем действовать.

    Большая часть усилий при разработке кода тратится на его поддержку. Так что я предпочитаю господствующие практики. Стек TCP имеет прочную основу и максимально оптимизирован для производительности. Также он намного (полностью?) Переносится между платформами и фреймворками. Контейнеры Docker на одном и том же хосте при обмене данными по TCP не попадают в провод. Если в какой-то день процессы достигают предела ресурсов, вы можете масштабироваться по горизонтали, разделив производителя и потребителя по физическим хостам - вручную или, скажем, с помощью Kubernetes. В этом случае TCP будет работать без проблем. Если вам никогда не понадобится такой уровень пропускной способности, вам также не понадобится изощренность системного уровня в межпроцессном взаимодействии.

    Идти по ПТС.

    23.07.2018
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..