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

Привет. У нас мобильное приложение, для него делаем доморощенный аналог

амплитуды.

Прошу вашей помощи, очень типичная задача, вижу в поиске много упрминаний юзер пропсов, но не нашел полного ответа.

Хотим получать ивенты и юзер пропсы с приложения и из других источников (например, из вебхуков эппла о подписках). И потом когда строить графики, хотим, чтобы у ивентов были эти юзер пропсы. Например, эппл сказал, что данный юзер подписан, все последующие события данного пользователя имеют свойство "подписан" true. Когда отписался, аналогично для будущих событий false.

Как обычно делается модель данных и архитектура приемника событий?

Варианты, что видим:
1. Сохранять пропсы в другой бд типа постгреса или даже редиса, в момент прихода ивента дёргать оттуда пропсы, популизовать ими ивент и сохранять в клик
2. Скидывать все в клик в одну таблицу и иметь materialized view, которые переводят пропсы и enriched events в две отдельные таблицы
3. Скидывать все в одну таблицу и иметь набор индексов и хитрые запросы, чтобы джойнить ее саму с собой, проставляя все незаполненные поля (насколько это медленно?)
4. См. 1, но без внешней бд. Но я так понимаю, что кх не очень хорошо подходит для выдергивания юзера на каждый новый ивент.

Объёмы: 100млн ивентов, 100к новых пользователей в месяц, до 1000 свойств.

Сейчас используем jitsu в качестве ингресса (мб есть какие-то аналоги?)

6 ответов

15 просмотров

> кх не очень хорошо подходит для выдергивания юзера на каждый новый ивент Для этого же и есть внешние словари, отдельный движок Redis тоже есть. Но при тысяче свойст стоит в первую очередь оценить потребление рамы. Подходит / не подходит — это всё в каждом конкретном сценарии использования стоит рассматривать. Если вам чисто детализацию по конкретным пользакам (или небольшой группе) в аналитике нужно по требованию выдавать, то #1 вариант самый простой, а если атрибуты используются непосредствено, то обогащать лучше где-то во вне. #2 вообще не понял, зачем что-то скидывать в одну таблицу, чтобы потом в итоге получать две разных? #3 "Скидывать всё в одну таблицу" — именно так, но только уже в готовом обогащённом виде, чтобы потом без всяких извращений с джойнами. Если есть возможность обогащать перед вставкой в клик, то стоит так и сделать, если нет, ну прикрутите ETL, тут же сценарий достаточно простой: извлекаете порцию данных, обогащаете, вставляете обратно в кликхаус

Alexander-Ulitin Автор вопроса
Илья Коргун
> кх не очень хорошо подходит для выдергивания юзе...

Спасибо. А не подскажете инструменты для приема и обогащения готовые? Мб либы. Что за внешние словари для этих целей?

Alexander Ulitin
Спасибо. А не подскажете инструменты для приема и ...

Выбор от уже используемого стека же зависит. Как и откуда события поступают? Типичный сценарий: кафка и флинк, либо самопичный подписчик Про словари: https://clickhouse.com/docs/en/sql-reference/dictionaries

может проще https://github.com/openreplay/openreplay взять? или https://github.com/PostHog/posthog и https://github.com/openmeterio/openmeter вместо того чтобы свое пилить?

ну, сделайте словарь какой то, например в REDIS и DIRECT LAYOUT апдейтите REDIS а в clickhouse через dictGet кладите текущее значение пропса...

JOIN Точно плохая идея. не надо так

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
70
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
25
Книга Юрова В.И пойдёт для обучения?
Botsman
24
Люди добрые, помогите с идеями, потому что свои закончились. У клиента падает софтина в момент инициализации модуля OtlEventMonitor на RegisterWindowMessage('Gp/OtlTaskEvents/...
Михаил Усков
7
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
> Примечательно, что новый владелец удаляет из GitHub любые жалобы, указывающие на подозрительную активность или смену владельца, и, видимо, рассчитывает на то, что пользовате...
Alex Sherbakov
2
GridView fully ignored first parent(SizedBox), and take width from second parent(Container). How can I constrain GridView by first parent? Widget build(BuildContext context) {...
Hamster
1
Hey there Which is the best Linux destro for developers (coding)? To my research on reddit, they said Linux mint is good for mid level spec and Ubuntu for high Lev hardwar...
Wiz 🪄
11
Подскажите пожалуйста, а я могу вот такую штуку использовать? rpc, только реализованное в реббите https://www.rabbitmq.com/tutorials/tutorial-six-php ( или https://habr.com/ru...
Artyom
11
И ещё вопрос: можно ли типа как на дос как-то запариться и с помощью прерываний выводить текст, вместо функции printf ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
34
Карта сайта