Идемпотентные потоки или предотвращение дублирования строк с помощью PipelineDB
Мое приложение создает вращающиеся файлы журнала, содержащие несколько метрик приложения. Файл журнала чередуется один раз в минуту, но каждый файл по-прежнему относительно большой (более 30 МБ, с 100 000 строк).
Я хотел бы подать журналы в PipelineDB (работающий на одной машине), который Countiuous View может создать для меня именно те агрегаты, которые мне нужны по метрикам.
Я легко могу отправить журналы в PipelineDB, используя копию из stdin, которая прекрасно работает.
Тем не менее, машина может неожиданно выключиться (например, из-за нехватки электроэнергии) во время копирования файла журнала. Это означает, что, как только вы вернетесь в онлайн, возникнет неопределенность, сколько файлов было вставлено в PipelineDB.
Как я могу гарантировать, что каждая строка в моих журналах вставляется ровно один раз в таких случаях? (Очень важно, чтобы я получил полное и точное агрегирование)
Обратите внимание, что каждая строка в файле журнала имеет уникальный идентификатор (серийный номер, созданный моим приложением), но я не могу найти в документации вариант определения уникального поля в потоке. Я предполагаю, что дизайн PipelineDB не предназначен для обработки уникальных полей в строках потока
Тем не менее, есть ли альтернативные решения этой проблемы?
1 ответ
Точно однажды семантика в контексте потоковой передачи (бесконечные строки) является очень сложной проблемой. В большинстве крупных развертываний PipelineDB используется некоторая инфраструктура шины сообщений (например, Kafka) перед PipelineDB для обеспечения семантики и надежности доставки, поскольку это не является основной задачей PipelineDB.
При этом есть пара подходов, которые вы могли бы использовать здесь, о которых стоит подумать.
Во-первых, вы можете поддерживать обычную таблицу в PipelineDB, которая отслеживает каждый файл журнала и номер строки, которые он успешно записал в PipelineDB. Когда вы начинаете отправлять новый лог-файл, сравните его с этой таблицей, чтобы определить, с какого номера строки начинать.
Во-вторых, вы можете разделить агрегаты по лог-файлу (включив путь или что-то в группу) и просто DELETE
любые существующие строки для этого файла журнала перед отправкой. Затем используйте объединение для агрегирования всех файлов журналов во время чтения, возможно с VIEW
,