powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / немного практической кафки в топик
25 сообщений из 63, страница 2 из 3
немного практической кафки в топик
    #40020729
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
andreykaT

я понимаю что "конец" очереди это вещь весьма условная. потому что он может быть конец на определенный момент времени который у всех к тому же разный. я думаю что конец а за долю секунды до того или после того залетело уже новое сообщение а я не знаю и думаю что конец а оно прилетает. понятно что это всё ОЧЕНЬ условно.
поэтому цель стоит прочитать всё что нужно из топика до определенного оффсета,потому что после него уже читают другие. или незадолго до него.
оффсет это понятие абсолютное. вот когда ты его попросил у кафки оно посмотрело в партицию и отдало тебе это значение. всё. так же у партиции есть как минимум, начало.


Я не специалист в Кафке от слова вообще. Но если предположить что Кафка работает на принципах TCP/IP
протокола. (А она работает) Тогда у нас есть 2 базовые стратегии как пушить или поллать месседж.

1) 1 TCP сообщение == 1 JMS/MQ/Kafka ообщение.
2) 1 TCP сообщение == много JMS/MQ/Kafka ообщений.

И мне кажется что таймауты которые видел Андрейка это второй кейс. Но тут надо смотреть в настройки
и мониторинг. Без этой инфы - мы как слепые котята.

да, по ходу там какие то сетевые проблемы были. у меня инет через симку и когда пинг становится до хоста трехзначный (500+мс) консамеры тупо сгребать данные перестают хотя выглядят как подключенные.

я пока стратегию построил так: часть консамеров в группе стартует с начала и до того момента которые определены как оффсет на момент подключения консамеров из группы Б, параллельно включаю консамеры из группы А но не с первого оффсета,а с последнего. итого на момент заканчивания работы первой группы я имею условно актуальные данные. то есть далее актуальность поддерживают консамеры из группы А.

всё.

вот каунтеры сделал да на конкурентхашмапе, в которой по ключам каждый консамер сохраняет последний оффсет. но кейса когда разные консамеры дергают один и тот же ключь улсовно "параллельно" - у меня нет.
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020731
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT
вот каунтеры сделал да на конкурентхашмапе, в которой по ключам каждый консамер сохраняет последний оффсет. но кейса когда разные консамеры дергают один и тот же ключь улсовно "параллельно" - у меня нет.


Я все равно ничего не понял. А хоть кто-то понял полёт твоей мысли?
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020742
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Я понялтолько то что интернет на симке это злостный оффтоп в теме.
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020752
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я только понял что все через жопу. Но может это было главным пунктом в ТЗ - тогда все ок
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020758
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник
Я только понял что все через жопу. Но может это было главным пунктом в ТЗ - тогда все ок

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

еще раз медленно.

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

как я это по крайней мере пока сделал:

запускаем с бегиннинга консамеры на топик1, при подключении все консамеры дружно запоминают максимальный оффсет на момент подключения. (та самая конкурентная мапа где ключ - партиция, значение - максОффсет на момент снятия данных. т.е. если я даже следом добавлю еще консамеров, или они отвалятся - ничего не произойдет они просто ребалансятся сами а данные берут оттуда же и доступ по ключам между консамерами конкурентный в принципе исключен. каждый консамер мутирует только значение своего ключа или ключей).

параллельно запускаем консамеры на топик2, но уже с КОНЦА (т.е. лови сообщения созданные после подключения). ждем пока консамеры топика1 дойдут до максимального оффсета, и гасим их. бд синхронизирована. топик2 консамеры продолжают работать. бд в состоянии синхрона.

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

зачем два топика? ведь можно было бы и дальше содержать только топик1? отвечаю. в топике1 нет событий по удалению записей. они через томбстон оттуда просто "исчезают" по ключам и эти события прилетают только через топик2. поэтому топик1 годен только для инициальной заливки бд, но не годен для постоянного синхрона. топик2 же наоборот имеет вменяемый ретеншн типа 2 недели и с него ты не вытянешь все данные для инициализации.

почему так сложно? а вот так вот. в идеале хорошо иметь один топик. и одну консамергруппу. но в данном случае это невозможно потому что нету поставщиков данных.
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020766
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT

что именно через жопу?

Использовать вместо нормальной БД какой-то самокат с треугольными колесами.

andreykaT

надо в бд слить с

INSERT INTO tableB SELECT * FROM tableA;

)))
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020770
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю как вы, но все равно нихера не понял.

Зачем нужен максимальный оффсет? Зачем надо гасить консюмеров? Почему не юзать стримы? Почему tombstone приходят во второй топик только? Почему не взять нормальный механизм репликации данных?

Вообще похоже что система создана взбесившимся архитектором, который услышал про NoSQL, асинхронность и кафку.
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020777
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT

ожидаемое поведение - стартуем 10 консамеров - все 10 консамеров гребут по 1000 сообщений.
что в реале - из 10-ти консамеров рандомно 2-3 консамера выгребают от 200 и до 1000 сообщений за один цикл

что за фигня. понимаю это больше не касательно джавы но все же. выходит кафка еще и не гарантирует отдачу сообщения даже если оно есть? ну то есть отдам когда-нибудь.

1. Не гарантируется что все доступные сообщения прийдут вам за один poll.
2. Если сервер таки даже смог на FetchRequest вывалить всё что у него было, то в общем случае не факт что poll отдаст их все за раз, хотя бы из-за той же настройки max.poll.records , которая по дефолту равна 500 и если вы её не меняли то уж 1000 за раз никак не получите.
2. Ecли даже poll вернул пустой список, это не значит что в топике нет мессаджей. poll банально может возвращать пустой список при возникновении большинства типов ошибок начиная с версии 2.1, до 2.1 poll мог просто виснуть.

Что касается клиента то теоритический максимум рекордов которые poll может вернуть вам за раз определяется как минимум настройками:
1. max.poll.records (default 500)
2. max.partition.fetch.bytes (default 1048576 aka 1Mb)
3. fetch.max.bytes (default 52428800 aka 5Mb)
4. Из пункта 2 и 3 очевидно что размер мессаджей тоже имеет значение и ещё какое.
5. На брокере есть аналогичные настройки вроде message.max.bytes
6. Также таймаут который вы передали в poll как аргумент в сочетании со способом которым продьюсер мессаджи записывал(успевал он их писать по одному или групировал в бэтчи).
7. Общая загруженость CPU и сети на консумере.

Осмыслите эти настройками и если всё равно что-то останется непонятным кидайте self-executable код (демонстрирующий непонятные моменты) на github, с помощью TestContainers это сейчас делать несложно, и я смогу посмотреть.
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020783
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT,
У тебя уже четвертый топик и всё дальше ты погружаешься....
Ничего личного (с)
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020785
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vimba,
Он не может осмыслить что асинхронный код по другому пишется.
Это значит, к примеру, есть кнопка стр3. Но при нажатии на страницу 3 вывалится Нет данных.
Это значит нет понятия ВЫГРЕБ ДО КОНЦА.
Идеотизм. Можно поиск гугла выгрести до конца?
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020788
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
andreykaT

что именно через жопу?

Использовать вместо нормальной БД какой-то самокат с треугольными колесами.

andreykaT

надо в бд слить с

INSERT INTO tableB SELECT * FROM tableA;

)))

а если базы НЕТ? тут чуть ранее все топили 1 бд 1 сервис и всё остальное на ивентах. получите распишитесь. а то как то непоследовательно.

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

Зачем нужен максимальный оффсет? Зачем надо гасить консюмеров? Почему не юзать стримы? Почему tombstone приходят во второй топик только? Почему не взять нормальный механизм репликации данных?

Вообще похоже что система создана взбесившимся архитектором, который услышал про NoSQL, асинхронность и кафку.

топик который можно использовать для первичной загрузки данных не содержит в себе инфу об удаленных сущностях. их там просто нет. то есть в него летят томбстоуны а не эти сущности с измененным например статусом или меткой удален. почему так? а вот так вот. другие сервисы используют эту логику и счастливы.

максимальный оффсет нужен чтоб знать - залились ли данные в промежутке от сих и до сих или нет. оффсет это что то что всегда растет и никогда не падает (по крайней мере в кафке).

еще раз. речь идет НЕ о репликации, речь идет о ремаппинге данных как минимум. они не кладутся в базу в том виде в каком летят из топика. то есть о подготовке и хранении в ином формате, считай скрс.
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020795
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Боже мой сколько слов ненужных
andreykaT
еще раз медленно.
надо в бд слить

andreykaT
а если базы НЕТ?

Дак есть бд или нет?)
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020807
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT
забыл ник
Не знаю как вы, но все равно нихера не понял.

Зачем нужен максимальный оффсет? Зачем надо гасить консюмеров? Почему не юзать стримы? Почему tombstone приходят во второй топик только? Почему не взять нормальный механизм репликации данных?

Вообще похоже что система создана взбесившимся архитектором, который услышал про NoSQL, асинхронность и кафку.

топик который можно использовать для первичной загрузки данных не содержит в себе инфу об удаленных сущностях. их там просто нет. то есть в него летят томбстоуны а не эти сущности с измененным например статусом или меткой удален. почему так? а вот так вот. другие сервисы используют эту логику и счастливы.

максимальный оффсет нужен чтоб знать - залились ли данные в промежутке от сих и до сих или нет. оффсет это что то что всегда растет и никогда не падает (по крайней мере в кафке).

еще раз. речь идет НЕ о репликации, речь идет о ремаппинге данных как минимум. они не кладутся в базу в том виде в каком летят из топика. то есть о подготовке и хранении в ином формате, считай скрс.


Писал долгий комментарий, что мол так нифига и не понял, и вдруг меня осенило - то есть походу ситуация следующая -

есть два топика, которые надо слить воедино и сохранить при этом некий ордеринг. Для этого ты вычитываешь оффсеты двух топиков, сохраняешь их, вычитываешь все что есть в первом топике(ну надеешься вычитать), после того как все вычитано - ты начинаешь читать из второго топика, используя оффсет прочитанный в самом начале?
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020814
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если все так, все равно выглядит как забивание гвоздей мало приспособленного для этого предметами.

Слушать две очереди (Queu), новые необработанные события где-то буфферизировать, когда появится полный "комплект" событий из обоих очередей - сливать, обрабатывать, результат выдавать в результирующую очередь.

Банальный, немного модифицированный, merge join из 3-его тома всем известного автора.

p.s. what is "топик" in Kafka - не знаю. Мое знание message driving архитектуры заканчивается на ConcurrentQueu
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020828
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое "максимальный оффсет на момент подключения" ?
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020898
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник
andreykaT
пропущено...

топик который можно использовать для первичной загрузки данных не содержит в себе инфу об удаленных сущностях. их там просто нет. то есть в него летят томбстоуны а не эти сущности с измененным например статусом или меткой удален. почему так? а вот так вот. другие сервисы используют эту логику и счастливы.

максимальный оффсет нужен чтоб знать - залились ли данные в промежутке от сих и до сих или нет. оффсет это что то что всегда растет и никогда не падает (по крайней мере в кафке).

еще раз. речь идет НЕ о репликации, речь идет о ремаппинге данных как минимум. они не кладутся в базу в том виде в каком летят из топика. то есть о подготовке и хранении в ином формате, считай скрс.


Писал долгий комментарий, что мол так нифига и не понял, и вдруг меня осенило - то есть походу ситуация следующая -

есть два топика, которые надо слить воедино и сохранить при этом некий ордеринг. Для этого ты вычитываешь оффсеты двух топиков, сохраняешь их, вычитываешь все что есть в первом топике(ну надеешься вычитать), после того как все вычитано - ты начинаешь читать из второго топика, используя оффсет прочитанный в самом начале?


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

итого таймлайн 1,2,3,4,5,6,7,8,9,10... итп. у нас точка входа типа в 7 (это таймлайн, это НЕ оффсеты), где 7 это настоящее время, 1 - это далекое прошлое и 10 это недалекое будущее. так вот, с топика А (который не содержит удаленных записей) мы читаем с 1 по 7. ,
с топика Б мы читаем с 7 - и дальше в будущее. читание начинается одновременно. то есть до того как топик А выключится у нас 1,7
12,78 123,789 и т.п. и в какой то момент времени становится 1,2,3...10. 1,2,3...11. 1,2,3...12 и т.п. топик А же выключится тогда когда гарантированно построится картина 1,2,3,4,5,6,7 (дальше не важно).
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020902
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Если все так, все равно выглядит как забивание гвоздей мало приспособленного для этого предметами.

Слушать две очереди (Queu), новые необработанные события где-то буфферизировать, когда появится полный "комплект" событий из обоих очередей - сливать, обрабатывать, результат выдавать в результирующую очередь.

никаких комплектов нет. синхронизаций нет буферов нет. говорю же. есть два топика - один компакт который содержит все ФАКТИЧЕСКИЕ записи, второй с ретеншеном, который содержит события удаления записей.

первый топик это типа "исторический" второй - текущий.

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

вкратце при запуске консамеров я один раз сохраняю все оффсеты всех партиций топика внутри консамера, и периодически снимаю с кафки значения закоммиченных оффсетов по всем партициям в рамках этой консамергруппы. далее просто сравниваю что первое минус второе дает. если больше нуля значит не доехал до "точки входа", если ноль и меньше - доехали. отваливаемся. понятно что могут быть некоторые накладки с другим топиком, но это небольшое количество дублей на "шве" которое не критично. доставку ат-лист-ванз оно вроде гарантирует.
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020903
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Что такое "максимальный оффсет на момент подключения" ?

ты вошел в топик и говоришь кафке - покажи мне ласт оффсеты по всем партициям. понятно что на момент выдачи тебе этих значений они могут быть уже и устаревшими. но как минимум они очень близки к неким "реальным". хотя что такое реальность?
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020907
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vimba
andreykaT

ожидаемое поведение - стартуем 10 консамеров - все 10 консамеров гребут по 1000 сообщений.
что в реале - из 10-ти консамеров рандомно 2-3 консамера выгребают от 200 и до 1000 сообщений за один цикл

что за фигня. понимаю это больше не касательно джавы но все же. выходит кафка еще и не гарантирует отдачу сообщения даже если оно есть? ну то есть отдам когда-нибудь.

1. Не гарантируется что все доступные сообщения прийдут вам за один poll.
2. Если сервер таки даже смог на FetchRequest вывалить всё что у него было, то в общем случае не факт что poll отдаст их все за раз, хотя бы из-за той же настройки max.poll.records , которая по дефолту равна 500 и если вы её не меняли то уж 1000 за раз никак не получите.
2. Ecли даже poll вернул пустой список, это не значит что в топике нет мессаджей. poll банально может возвращать пустой список при возникновении большинства типов ошибок начиная с версии 2.1, до 2.1 poll мог просто виснуть.

Что касается клиента то теоритический максимум рекордов которые poll может вернуть вам за раз определяется как минимум настройками:
1. max.poll.records (default 500)
2. max.partition.fetch.bytes (default 1048576 aka 1Mb)
3. fetch.max.bytes (default 52428800 aka 5Mb)
4. Из пункта 2 и 3 очевидно что размер мессаджей тоже имеет значение и ещё какое.
5. На брокере есть аналогичные настройки вроде message.max.bytes
6. Также таймаут который вы передали в poll как аргумент в сочетании со способом которым продьюсер мессаджи записывал(успевал он их писать по одному или групировал в бэтчи).
7. Общая загруженость CPU и сети на консумере.

Осмыслите эти настройками и если всё равно что-то останется непонятным кидайте self-executable код (демонстрирующий непонятные моменты) на github, с помощью TestContainers это сейчас делать несложно, и я смогу посмотреть.


это выглядит так (по крайней мере внешне) что полл дернул но ничего не пришло.
те конфиги что ты показал я естественно заиспользовал. размеры мессаджей там несоклкьо сотен килбоайт. батч на полл как раз 500.
поллит раз в полсекунды.

я поигрался с настройками, ты ставишь батч 500 тебе с 10-ти партиций прилетает только в 1-2. ставишь батч 50 - тебе прилетает со всех 10ти партиций. :) но.. оптяь же оно может и по 500 с 10-ти партиций слать, но гораздо реже.
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020913
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT
mayton
Что такое "максимальный оффсет на момент подключения" ?

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

Главное чтоб они были консистентны друг с другом и с твоей предментной областью на некий момент времени t.
Чтоб ты получил 2+2=4. А не 3 и не 5.

Пример - я делаю SELECT в Oracle по табличке которая интенсивно UPDAtE-ится. Я все равно
получу 100% строк консистентных с неким тайм-штампом (технически это SCN) который был синхронным
с началом моей читающей транзакции.
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020969
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Автор выбрал message driven. А это отказ от консистентности))))
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020970
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT
это выглядит так (по крайней мере внешне) что полл дернул но ничего не пришло.
у тебя не должно ничего ломаться в данном случае. Трагедию нашел.
Бери РСУБД. Там дернул и 100 процентов получил.
Микросервисники блин.
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020976
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Вот теорема САР
https://ru.m.wikipedia.org/wiki/Теорема_CAP
И он хочет упрямо как баран чтобы у него все 3 буквы С и А и Р работали.
Уже пол года хочет а в школу не ходил.
...
Рейтинг: 0 / 0
немного практической кафки в топик
    #40020977
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю что весь реальный физический мир - message driven.
Яркий пример - IP протокол и бизнес операции по SWIFT,
межбанковские переводы и электронная почта.
...
Рейтинг: 0 / 0
25 сообщений из 63, страница 2 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / немного практической кафки в топик
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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