184 похожих чатов

Подскажите плиз начинающим на нелегком пути выстраивания bi Есть сервис владелец

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

Дальше появляется кейс когда объект на сервисе начинает обновлять свое состояние, соответственно в кх его надо актуализировать. Полистал доку кх, кажется больше всего тут подходит VersionedCollapsedMergeTree. Сервис владелец при каждом изменении состояния объекта шлёт в отельный топик его новые состояния, а другой консьюмер кх его слушает и инсертит в таблицу выполняя схлопывание.
Но тут встает вопрос партиций в кафке, очередность там гарантируется только в пределах партиций, соответственно более раннее состояние может быть вычитано позднее актуального.
Как наиболее канонично такие ситуации обыгрывать? На сервисе владельце тоже явно вести инкремент версии состояния и в кх его юзать при запросе на инсерт? Или как-то вокруг таймстампа кафка-мессаджа обыгрывают консистентность.

Судя по всему вопрос тут вообще не столько про кх, сколько про правильный eventual consistency, но кафка у нас только-только внедряется для целей bi, поэтому не все бестпрактисы ее использования ещё впитаны.

4 ответов

22 просмотра

там время есть как поле? если изменения внутри одной PARTITION BY (см. CREATE TABLE в clickhouse) в целевой clickhouse таблице, то он сольются в дальнейшем на background merge вообще VersionedCollapsing просто работает для одинаковых ORDER BY сортируется по version и дальше схлопывание... ну и вам знания о SELECT .. FROM table FINAL не помешает https://kb.altinity.com/altinity-kb-queries-and-syntax/altinity-kb-final-clause-speed/

Александр-Мошкин Автор вопроса
Slach [altinity]
там время есть как поле? если изменения внутри о...

Время апдейта состояния? Вообще да, есть два поля на объекте: created_at, updated_at. Партиционирование выполнено по created_at. Тут вопрос как правильно держать именно актуальное состояние. В топике кафки с изменениями состояния объекта например 2 партиции. В 1 партиции более позднее состояние, во 2 более раннее. Мы не можем знать какое из них кх прочитает быстрее, но в кх должно остаться более позднее. Мы могли бы ориентироваться на updated_at, но как сравнить его значение с тем что уже в кх? Ведь выборка предыдущего состояния из кх происходит с помощью агрегации HAVING sum(Sign)>1, при этом дока говорит что агрегатные min/max нельзя использовать. Я же не могу написать HAVING sum(Sign) > 1 AND max(updated_at) < new_updated_at?

Александр Мошкин
Время апдейта состояния? Вообще да, есть два поля ...

не надо про updated_at это просто "время апдейта", его в качестве version можно использовать

Александр Мошкин
Время апдейта состояния? Вообще да, есть два поля ...

еще раз. "одинаковость" строк определяется значениями полей которые перечислены в ORDER BY

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

Обсуждают сегодня

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта