KEKSOV
@KEKSOV

Готовую реализацию для IPC с буферизацией?

В рамках одного компьютера работают два процесса — Процесс А собирает данные с оборудования, он очень быстрый и его допиливать нужно очень осторожно, поэтому запись данных в MySQL вынесена в отдельный Процесс Б. Особенность задачи в том, что базы данных может в какой-то момент не быть — сервер выключили, сеть пропала и т.п., при этом данные пропасть не должны — когда снова появляется БД они должны быть туда записаны. Получается, что процесс А должен их сохранять в какой-то промежуточный буфер (файл), а процесс Б их читать из этого буфера (и удалять их оттуда после успешной записи в БД). Напрашивается реализация что-то типа MemoryStream поверх memory mapped file, с синхронизацией через семафоры/события. Еще как вариант — SQLite база, но не хочется ее сюда тащить для решения такой узкой задачи.


Возможно, кто-то сталкивался с подобной задачкой и может подсказать готовое решение.
  • Вопрос задан
  • 2904 просмотра
Пригласить эксперта
Ответы на вопрос 2
IlyaEvseev
@IlyaEvseev
Opensource geek
1) Универсальный вариант — это Redis, т.е. быстрое клиент-серверное nosql-хранилище в ОЗУ со снимками на диск.

2) Если требуется что-то предельно простое, то можно создать pipe с буфером максимального размера.
stackoverflow.com/questions/4624071/pipe-buffer-size-is-4k-or-64k

Процесс А читает данные и пишет в pipe. Процесс Б читает pipe и пишет в базу. Буферизацию выполняет Линукс.

Главные моменты, на которые надо обратить внимание:
— максимальный размер буфера для pipe,
— возможность потерять данные из-за аварийного завершения Б.

3) Если писать в mysql-таблицу типа Memory или Archive с помощью INSERT DELAYED прямо из А, скорость удовлетворительная?
Ответ написан
@mayorovp
А чем не устраивает второй поток в рамках того же процесса?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы