Идемпотентные потоки или предотвращение дублирования строк с помощью PipelineDB - PullRequest
0 голосов
/ 09 мая 2018

Мое приложение создает вращающиеся файлы журнала, содержащие несколько метрик приложения. Файл журнала чередуется один раз в минуту, но каждый файл все еще относительно велик (более 30 МБ и 100 тыс. Строк)

Я бы хотел передать журналы в PipelineDB (работающую на одной машине), которую Countiuous View может создать для меня именно те агрегаты, которые мне нужны по метрикам.

Я легко могу отправить журналы в PipelineDB, используя копию из stdin, которая прекрасно работает.

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

Как я могу гарантировать, что каждая строка в моих журналах вставляется ровно один раз в таких случаях? (Очень важно, чтобы я получил полное и точное агрегирование)

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

Тем не менее, есть ли альтернативные решения этой проблемы?

1 Ответ

0 голосов
/ 10 мая 2018

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

При этом есть пара подходов, которые вы могли бы использовать здесь, о которых стоит подумать.

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

Во-вторых, вы можете разделить агрегаты по лог-файлу (включив путь или что-то в группировку) и просто DELETE любые существующие строки для этого лог-файла перед отправкой. Затем используйте объединить для агрегирования по всем файлам журналов во время чтения, возможно, с VIEW.

...