Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / два топика две сущности / 11 сообщений из 11, страница 1 из 1
01.06.2021, 00:24
    #40074561
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
два топика две сущности
и снова я тут.
собссно тема. не знаю как лучше сделать. хранилище - эластик.
есть топик А по нему летят документы А, есть топик Б в него летят документы Б.
документ А содержит лист документов Б.

документы Б могут удаляться, или же менять владельца (документ А).

в топике Б документы летят с одним только статусом - криейт апдейт и делет. документ Б содержит ключ от документа А.

есть требование в выдаче отдавать список документов А, (в каждом внутри список документов Б).

собссно варианта два:
1) мы держим два индекса и на лету при выдаче их джоиним. ну типа запрос в первый индекс и во второй а потом склеиваем. - производительность конечно же упадет.
2) мы получаем некий апдейт документа Б, идем по айди документа Б в индекс А, находим там документ А, и смотрим айди документа А в документе Б. и если они одинаковые обновляем документ А. если нет то удаляем из документа А и вкладываем документ Б в новый документ А. - тут просаживаемся по перформансу уже на инсерте. да еще и заморочки с версионированием получаем.

вроде в эластике есть штука с почти классическими джойнами но ее советуют не использовать.
...
Рейтинг: 0 / 0
01.06.2021, 06:21
    #40074572
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
два топика две сущности
andreykaT,

При чем тут ElasticSearch :-)

Главное из эластика вытащить список id-ников, по которым из БД вытаскиваются уже полные данные.
<:o)
...
Рейтинг: 0 / 0
01.06.2021, 11:47
    #40074659
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
два топика две сущности
ElasticSearch (если он имеется в виду) это все таки документно-ориентированная система. Ищем по ключевым словам
документы и получаем их контент. Поэтому при изменениях документов - надо их просто актуализировать в индексе.
...
Рейтинг: 0 / 0
01.06.2021, 14:08
    #40074702
fixxer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
два топика две сущности
Если есть возможность для документов Б, в случае смены владельца, вместо события изменения публиковать удаление + создание, то лучше сделать так. Это _значительно_ упростит консьюмера. Если такой возможности нет, то придется хранить состояние связи Б -> A, но я бы не стал это делать в эластике. Можно либо использовать локальное для ноды консьюмера хранилище (RocksDB), так делает Flink, либо отдельный компактный топик в кафке, так делает KafkaStreams. Соответственно, при получении события изменения Б, сверяемся с состоянием и если связь Б->A не изменилась делаем update документа в эластике, а если изменилась, то делаем delete + insert и обновляем состояние. Это несложно написать самому, а можно также написать Stateful Consumer на Flink или KafkaStreams.
...
Рейтинг: 0 / 0
01.06.2021, 18:08
    #40074829
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
два топика две сущности
mad_nazgul
andreykaT,

При чем тут ElasticSearch :-)

Главное из эластика вытащить список id-ников, по которым из БД вытаскиваются уже полные данные.
<:o)

нет никакой бд. эластик и есть документная бд. да. в данном контексте шла речь про документную бд.

в общем у нас есть А с листом Б внутри. операции есть где Б добавляется в А или Б удаляется из А.

есть топик куда летят А есть топик куда летят Б (с айдишкой на А).

я всё же склоняюсь к одному индексу куда буду складывать и А и Б (отыскивая их по айди А и просто добавляя в лист.

суть сервиса - быстрый ответ пользователю поэтому данные надо держать типа подготовленными. наверное это ближе всего к CQRS и последнее его звено.

тут уже скорее специфика эластика пошла. я читаю сущность А из бд, добавляю в нее элементы Б из топика и кладу А+Б в бд. но. транзакций никаких нет :) там вроде есть версионность. типа оптимистическая блокировка. играюсь с ней. суть в том что если не смог вложить Б в А то просто не коммичу мессадж в кафке и делаю попытку еще раз пока не будте успеха в сохранении.
...
Рейтинг: 0 / 0
01.06.2021, 18:10
    #40074830
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
два топика две сущности
fixxer
Если есть возможность для документов Б, в случае смены владельца, вместо события изменения публиковать удаление + создание, то лучше сделать так. Это _значительно_ упростит консьюмера. Если такой возможности нет, то придется хранить состояние связи Б -> A, но я бы не стал это делать в эластике. Можно либо использовать локальное для ноды консьюмера хранилище (RocksDB), так делает Flink, либо отдельный компактный топик в кафке, так делает KafkaStreams. Соответственно, при получении события изменения Б, сверяемся с состоянием и если связь Б->A не изменилась делаем update документа в эластике, а если изменилась, то делаем delete + insert и обновляем состояние. Это несложно написать самому, а можно также написать Stateful Consumer на Flink или KafkaStreams.

мы ограничены в списке технологий - кафка и эластик. причем с рестхл-клиентом. хотя это наверное и к лучшему :)
...
Рейтинг: 0 / 0
01.06.2021, 18:13
    #40074833
fixxer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
два топика две сущности
andreykaT

мы ограничены в списке технологий - кафка и эластик. причем с рестхл-клиентом. хотя это наверное и к лучшему :)


Ну, ручками напиши стейтфул консамер с использованием компакт топика, наподобии KafkaStreams. И непонятно, почему KafkaStreams нельзя использовать? Это всего лишь библиотека.
...
Рейтинг: 0 / 0
01.06.2021, 18:56
    #40074853
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
два топика две сущности
кафкастримз можно. ты там выше какое то хранилище я так понял упомянул. по кафкастримз не очень понял идею, сорян.
...
Рейтинг: 0 / 0
01.06.2021, 19:10
    #40074861
fixxer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
два топика две сущности
andreykaT
по кафкастримз не очень понял идею, сорян.


Ну так пойми.

Разжевываю для первоклашек.

1. Тебе нужно хранить связь Б->A чтобы определить, что обновление Б меняет родителя и сделать delete + insert, вместо update.
2. Ты можешь просто хранить это в Map в памяти. Но это не переживет перезапуска сервиса. Хранилище должно быть персистентным, но локальным, для перфоманса, и при этом партиционировано также как и топик событий для Б.
3. KafkaStreams предлагает использовать для хранения состояния еще один топик в кафке, по принципу чейдж-лога реляционной таблицы. Компакт-топик изоморфен таблице. KTable

На каком пункте пропадает понимание?
...
Рейтинг: 0 / 0
01.06.2021, 20:40
    #40074879
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
два топика две сущности
андреич,тут же гарик пояснил за кафку- что это шляпа,никто ее не юзает с его слов- зачем оно тебе?
...
Рейтинг: 0 / 0
02.06.2021, 09:53
    #40074943
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
два топика две сущности
asv79
андреич,тут же гарик пояснил за кафку- что это шляпа,никто ее не юзает с его слов- зачем оно тебе?

если ты пишешь петпроект где один запрос в день то не нужно. шляпа это ты ))
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / два топика две сущности / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]