Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 два топика две сущности  [new]
andreykaT
Member

Откуда: =||==
Сообщений: 3402
и снова я тут.
собссно тема. не знаю как лучше сделать. хранилище - эластик.
есть топик А по нему летят документы А, есть топик Б в него летят документы Б.
документ А содержит лист документов Б.

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

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

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

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

вроде в эластике есть штука с почти классическими джойнами но ее советуют не использовать.
1 июн 21, 00:24    [22329615]     Ответить | Цитировать Сообщить модератору
 Re: два топика две сущности  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5688
andreykaT,

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

Главное из эластика вытащить список id-ников, по которым из БД вытаскиваются уже полные данные.
<:o)
1 июн 21, 06:21    [22329636]     Ответить | Цитировать Сообщить модератору
 Re: два топика две сущности  [new]
mayton
Member

Откуда: loopback
Сообщений: 51389
ElasticSearch (если он имеется в виду) это все таки документно-ориентированная система. Ищем по ключевым словам
документы и получаем их контент. Поэтому при изменениях документов - надо их просто актуализировать в индексе.
1 июн 21, 11:47    [22329746]     Ответить | Цитировать Сообщить модератору
 Re: два топика две сущности  [new]
fixxer
Member

Откуда:
Сообщений: 835
Если есть возможность для документов Б, в случае смены владельца, вместо события изменения публиковать удаление + создание, то лучше сделать так. Это _значительно_ упростит консьюмера. Если такой возможности нет, то придется хранить состояние связи Б -> A, но я бы не стал это делать в эластике. Можно либо использовать локальное для ноды консьюмера хранилище (RocksDB), так делает Flink, либо отдельный компактный топик в кафке, так делает KafkaStreams. Соответственно, при получении события изменения Б, сверяемся с состоянием и если связь Б->A не изменилась делаем update документа в эластике, а если изменилась, то делаем delete + insert и обновляем состояние. Это несложно написать самому, а можно также написать Stateful Consumer на Flink или KafkaStreams.

Сообщение было отредактировано: 1 июн 21, 14:03
1 июн 21, 14:08    [22329820]     Ответить | Цитировать Сообщить модератору
 Re: два топика две сущности  [new]
andreykaT
Member

Откуда: =||==
Сообщений: 3402
mad_nazgul
andreykaT,

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

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

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

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

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

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

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

тут уже скорее специфика эластика пошла. я читаю сущность А из бд, добавляю в нее элементы Б из топика и кладу А+Б в бд. но. транзакций никаких нет :) там вроде есть версионность. типа оптимистическая блокировка. играюсь с ней. суть в том что если не смог вложить Б в А то просто не коммичу мессадж в кафке и делаю попытку еще раз пока не будте успеха в сохранении.
1 июн 21, 18:08    [22330006]     Ответить | Цитировать Сообщить модератору
 Re: два топика две сущности  [new]
andreykaT
Member

Откуда: =||==
Сообщений: 3402
fixxer
Если есть возможность для документов Б, в случае смены владельца, вместо события изменения публиковать удаление + создание, то лучше сделать так. Это _значительно_ упростит консьюмера. Если такой возможности нет, то придется хранить состояние связи Б -> A, но я бы не стал это делать в эластике. Можно либо использовать локальное для ноды консьюмера хранилище (RocksDB), так делает Flink, либо отдельный компактный топик в кафке, так делает KafkaStreams. Соответственно, при получении события изменения Б, сверяемся с состоянием и если связь Б->A не изменилась делаем update документа в эластике, а если изменилась, то делаем delete + insert и обновляем состояние. Это несложно написать самому, а можно также написать Stateful Consumer на Flink или KafkaStreams.

мы ограничены в списке технологий - кафка и эластик. причем с рестхл-клиентом. хотя это наверное и к лучшему :)
1 июн 21, 18:10    [22330007]     Ответить | Цитировать Сообщить модератору
 Re: два топика две сущности  [new]
fixxer
Member

Откуда:
Сообщений: 835
andreykaT

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


Ну, ручками напиши стейтфул консамер с использованием компакт топика, наподобии KafkaStreams. И непонятно, почему KafkaStreams нельзя использовать? Это всего лишь библиотека.
1 июн 21, 18:13    [22330010]     Ответить | Цитировать Сообщить модератору
 Re: два топика две сущности  [new]
andreykaT
Member

Откуда: =||==
Сообщений: 3402
кафкастримз можно. ты там выше какое то хранилище я так понял упомянул. по кафкастримз не очень понял идею, сорян.
1 июн 21, 18:56    [22330033]     Ответить | Цитировать Сообщить модератору
 Re: два топика две сущности  [new]
fixxer
Member

Откуда:
Сообщений: 835
andreykaT
по кафкастримз не очень понял идею, сорян.


Ну так пойми.

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

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

На каком пункте пропадает понимание?

Сообщение было отредактировано: 1 июн 21, 19:02
1 июн 21, 19:10    [22330044]     Ответить | Цитировать Сообщить модератору
 Re: два топика две сущности  [new]
asv79
Member

Откуда: Тверь
Сообщений: 3329
андреич,тут же гарик пояснил за кафку- что это шляпа,никто ее не юзает с его слов- зачем оно тебе?
1 июн 21, 20:40    [22330065]     Ответить | Цитировать Сообщить модератору
 Re: два топика две сущности  [new]
andreykaT
Member

Откуда: =||==
Сообщений: 3402
asv79
андреич,тут же гарик пояснил за кафку- что это шляпа,никто ее не юзает с его слов- зачем оно тебе?

если ты пишешь петпроект где один запрос в день то не нужно. шляпа это ты ))
2 июн 21, 09:53    [22330177]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить