Size: a a a

Scalability Camp — чат про распределенные системы (и про HPC)

2021 March 02

AT

Andrey Terekhov in Scalability Camp — чат про распределенные системы (и про HPC)
Zlata Obukhovskaya
Вообще у меня был вопрос, что лучше использовать, чтобы апдейты в базе слать через вебсокеты на фронт?
Шутки ради могу предлжить схему PG (+extension) -> RMQ (+Web STOMP) -> JS (+Web STOMP over Web-socket)

https://github.com/subzerocloud/pg-amqp-bridge
https://github.com/stomp-js/stompjs
источник

N

Nikolay in Scalability Camp — чат про распределенные системы (и про HPC)
а это тогда не задача синхронизации, как в dropbox, например, когда нужно синхронизироваться с сервером, но при этом уметь работать локально?
источник

ZO

Zlata Obukhovskaya in Scalability Camp — чат про распределенные системы (и про HPC)
Nikolay
интересный вопрос. это наверное зависит от многих факторов. в том числе какая семантика доставки нас интересует. Например, если клиент был оффлайн. Должен ли он получить все ивенты, когда он вновь станет онлайн. А так же видится важным сколько таких клиентов и сколько каналов они слушают. Например если у нас подразумевается, что возможет 1миллион клиентов и 1 миллион каналов( которые условно топики), то решение одно, а если клиентов и топиков очень мало, то можно построить такое на другом наборе систем .
Я думаю, что устаревшие ивенты можно успешно фильтровать на фронте
источник

AT

Andrey Terekhov in Scalability Camp — чат про распределенные системы (и про HPC)
Zlata Obukhovskaya
Я думаю, что устаревшие ивенты можно успешно фильтровать на фронте
наверно вопрос был в том стоит ли их где-то хранить и при выходе юезра онлайн досылать всё что он пропустил
если да, то ему персональная очередь, нужна, если нет то fanout должно хватить
источник

AT

Andrey Terekhov in Scalability Camp — чат про распределенные системы (и про HPC)
Zlata Obukhovskaya
Вообще у меня был вопрос, что лучше использовать, чтобы апдейты в базе слать через вебсокеты на фронт?
а хочется совсем без софтовой прослойки, т.е. чтобы события из базы напрямую генерились?
источник

ZO

Zlata Obukhovskaya in Scalability Camp — чат про распределенные системы (и про HPC)
Andrey Terekhov
наверно вопрос был в том стоит ли их где-то хранить и при выходе юезра онлайн досылать всё что он пропустил
если да, то ему персональная очередь, нужна, если нет то fanout должно хватить
Пока я не могу придумать кейса, где нужна exactly once доставка ивентов
источник

ZO

Zlata Obukhovskaya in Scalability Camp — чат про распределенные системы (и про HPC)
Andrey Terekhov
а хочется совсем без софтовой прослойки, т.е. чтобы события из базы напрямую генерились?
На самом деле нет. Я могу отправлять эти ивенты в софтовую прослоку в том месте, где происходит запись в базу. Просто я хотела узнать, какие архитектурные решения для такого кейса существуют
источник

S

Slach in Scalability Camp — чат про распределенные системы (и про HPC)
Zlata Obukhovskaya
Пока я не могу придумать кейса, где нужна exactly once доставка ивентов
ну, кейс простой, consumer получая ивент должен писать его в хранилище в котором нет дедупликации и unique constrains
и нужна гарантия что "событие записалось только один раз"

таким хранилищем может быть clickhouse
источник

AT

Andrey Terekhov in Scalability Camp — чат про распределенные системы (и про HPC)
Zlata Obukhovskaya
На самом деле нет. Я могу отправлять эти ивенты в софтовую прослоку в том месте, где происходит запись в базу. Просто я хотела узнать, какие архитектурные решения для такого кейса существуют
Ну я тогда присоединяюсь к вопросу, потому что хочется ответить что-то в общих чертах про очереди)
Типа берём событие, присваиваем ему тэги, шлём в шину, а дальше рассылаем по нужным очередям/комнатам/подпискам или всем подряд. Про rmq наверно особо смысла и нет говорить?
источник

OS

Oleg Sidorkin in Scalability Camp — чат про распределенные системы (и про HPC)
Мы у себя прямо в базе  держали очередь "эвентов" с растущей версией. Когда клиент приходил, он присылал свою версию, ему выгружались все "эвенты", (смёрдженные в один большой "эвент") с новой версией. Если очередь становилась слишком длинной, то считали, что проще выгрузить ему таблицу целиком, и удаляли очередь.
источник

AP

Alexey Prudnikov in Scalability Camp — чат про распределенные системы (и про HPC)
Zlata Obukhovskaya
именно! :)
Не пробовали Debezium?

https://debezium.io/documentation/reference/architecture.html

Судя по описанию архитектуры, как раз реализуется нужный кейс.

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

ZO

Zlata Obukhovskaya in Scalability Camp — чат про распределенные системы (и про HPC)
Andrey Terekhov
Ну я тогда присоединяюсь к вопросу, потому что хочется ответить что-то в общих чертах про очереди)
Типа берём событие, присваиваем ему тэги, шлём в шину, а дальше рассылаем по нужным очередям/комнатам/подпискам или всем подряд. Про rmq наверно особо смысла и нет говорить?
У этого похода есть минус. Когда логика записи в базу размазана по нескольких микросервисам (как у меня). А на фронте нужно получать поток ивентов, сэммитированных по сути несколькими микросервисами. И тут важна не только семантика доставки ивентов, но и консистентность данных. Сейчас я думаю, что time-bound eventual consistency подойдет, но продуктовые требования могут измениться в сторону ужесточения ограничений.
источник

ZO

Zlata Obukhovskaya in Scalability Camp — чат про распределенные системы (и про HPC)
Подход с Debezium кажется подходит под продуктовые требования, но у меня тут вопрос, как у человека, отвечающего за управление технологическим стеком. А эта туловина она насколько распространена вообще и в каких кейсах?
источник

DP

D P in Scalability Camp — чат про распределенные системы (и про HPC)
Zlata Obukhovskaya
именно! :)
Можно написать плагин для репликации из PG. Можно взять wal2json и его вывод уже отправлять
источник

AT

Andrey Terekhov in Scalability Camp — чат про распределенные системы (и про HPC)
Zlata Obukhovskaya
У этого похода есть минус. Когда логика записи в базу размазана по нескольких микросервисам (как у меня). А на фронте нужно получать поток ивентов, сэммитированных по сути несколькими микросервисами. И тут важна не только семантика доставки ивентов, но и консистентность данных. Сейчас я думаю, что time-bound eventual consistency подойдет, но продуктовые требования могут измениться в сторону ужесточения ограничений.
Про микросервисы не было сказано, хотя это и ожидаемо)
Ну да, пониманию в чём проблема.
Субъективно по ощущениям нужен небольшой буфер, который как раз будет выстраивать все события в нужном порядке и разрешать конфликты.
Вариант с wal интересный, но если у микросервисов свои базы, и данные между ними зависимы, то всё равно наверно придётся их синхронизировать между собой, прежде чем отдавать на фронт
источник

ZO

Zlata Obukhovskaya in Scalability Camp — чат про распределенные системы (и про HPC)
Andrey Terekhov
Про микросервисы не было сказано, хотя это и ожидаемо)
Ну да, пониманию в чём проблема.
Субъективно по ощущениям нужен небольшой буфер, который как раз будет выстраивать все события в нужном порядке и разрешать конфликты.
Вариант с wal интересный, но если у микросервисов свои базы, и данные между ними зависимы, то всё равно наверно придётся их синхронизировать между собой, прежде чем отдавать на фронт
У соседей есть решение с отправкой в кафка, а затем фильтрацией на прослойке, которая отдает по вэбсокетам. Синхронизацию ивентов они органиовать не могут (просто не готовы вбухать в это кучу времени), поэтому там eventual consistency. В их случае такой подход оправдан, потому что у них точек отправки этих ивентов в кафку ну вот прямо очень много.
источник

НХ

Николай Хитров... in Scalability Camp — чат про распределенные системы (и про HPC)
Zlata Obukhovskaya
У этого похода есть минус. Когда логика записи в базу размазана по нескольких микросервисам (как у меня). А на фронте нужно получать поток ивентов, сэммитированных по сути несколькими микросервисами. И тут важна не только семантика доставки ивентов, но и консистентность данных. Сейчас я думаю, что time-bound eventual consistency подойдет, но продуктовые требования могут измениться в сторону ужесточения ограничений.
можно сделать backend for frontend, который будет слушать все эти ивенты, агрегировать и дальше слать во фронт
источник

AT

Andrey Terekhov in Scalability Camp — чат про распределенные системы (и про HPC)
Николай Хитров
можно сделать backend for frontend, который будет слушать все эти ивенты, агрегировать и дальше слать во фронт
ну вот прослойка я так понял это и делает
источник

НХ

Николай Хитров... in Scalability Camp — чат про распределенные системы (и про HPC)
Andrey Terekhov
ну вот прослойка я так понял это и делает
не успел дочитать)
да, оно
источник

AP

Alexey Prudnikov in Scalability Camp — чат про распределенные системы (и про HPC)
Zlata Obukhovskaya
Подход с Debezium кажется подходит под продуктовые требования, но у меня тут вопрос, как у человека, отвечающего за управление технологическим стеком. А эта туловина она насколько распространена вообще и в каких кейсах?
У меня, к сожалению, тот же самый вопрос возникает - продукт достаточно молодой и информации по нему маловато. Знаю только, что за ним стоит Red Hat, то есть эта история не совсем на голом энтузиазме держится. Но конкретных внедрений ни сам пока не делал, ни у коллег не видел.
источник