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

А у меня в связи с обсуждением тоже назрел вопрос.

А как в микросервисах и кубере решают задачу распределенных примитивов(локи, лидер елекшн). Сейчас у нас монолит и отдельно поднят зукипер (там же дискавери). Вообще появляется ли такой вопрос в микросервисах? И если про leader election (заставить только один инстанс приложения выполнять отдельную логику) можно решить, просто выделив в отдельный сервис, то что делать с локами не понятно. Отдельный etcd/zookeeper/redis?

33 ответов

17 просмотров

я обычно беру что-то типа https://github.com/lukas-krecan/ShedLock и использую (как бэкенд - или какой-то постгресс, или что-то еще, тут много вариантов)

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

Владислав-Хакин Автор вопроса
Evgenii Eliseev
известный мне подход: локи в бд. если нужно выполн...

Локи в бд может быть очень неэффективно (если модель пуллинга бд), зукипер, етсд дают модель подписки на изменение ключа

Владислав-Хакин Автор вопроса
Denis Pavlyuchenko
я обычно беру что-то типа https://github.com/lukas...

Тоже опирается на что-то типа бд, зукипер и тд. Я так понимаю это скорее аналог spring-cloud компонента лока, чем отдельное решения для синхронизации

Владислав Хакин
Локи в бд может быть очень неэффективно (если моде...

конкретно в моем приложении локи это именно локи данных. по этому так

Владислав-Хакин Автор вопроса
Evgenii Eliseev
конкретно в моем приложении локи это именно локи д...

Локи данных в бд? Или распределенные локи в приложении?(java.concurrent.Lock)

Владислав Хакин
Локи в бд может быть очень неэффективно (если моде...

так-то согласен что эти вещи эффективнее хотя бы потому что бд не совсем тот инструмент для разруливания синхронизации

Владислав-Хакин Автор вопроса
Evgenii Eliseev
так-то согласен что эти вещи эффективнее хотя бы п...

Тогда понятно, вопрос именно синхронизации блоков в коде, чтобы в этот момент не появилось несогласованных данных например (проблема атомарности проверки наличия данных)

кстати интересно было бы узнать для каких примерно задач предполагаются эти локи? распределеные транзакции?

Владислав-Хакин Автор вопроса
Evgenii Eliseev
кстати интересно было бы узнать для каких примерно...

Ну например при реакции на событие проверить, что нет уже чего-то созданного в другом приложении

Владислав-Хакин Автор вопроса
Evgenii Eliseev
чем тут гн подходит rdbms? долго?

Другой инстанс может параллельно обрабатывать этот же событие

Владислав Хакин
Другой инстанс может параллельно обрабатывать этот...

пишут в одно место? две транзакции. одна навернется например по unique key. или я не догнал

Владислав-Хакин Автор вопроса
Evgenii Eliseev
пишут в одно место? две транзакции. одна навернетс...

Да классическая проблема параллельного кода (что решалось бы блоком синхронизации) если бы не были разные приложения. Если чего-то нет, выполни код. А параллельно другой инстанс может заканчивать создания этого самого. Так карты легли и балансировщик раскинул запросы пользователя например.

Владислав-Хакин Автор вопроса
Evgenii Eliseev
пишут в одно место? две транзакции. одна навернетс...

Ключа уникального не будет, потому что может быть много таких записей вцелом(но одна активная)

Владислав Хакин
Ключа уникального не будет, потому что может быть ...

то есть в etcd один процесс кладет "я начал ид=123" а второй падает/идет в другую ветку ифа если оно там есть?

Владислав-Хакин Автор вопроса
Evgenii Eliseev
то есть в etcd один процесс кладет "я начал ид=123...

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

Владислав-Хакин Автор вопроса
Evgenii Eliseev
то есть в etcd один процесс кладет "я начал ид=123...

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

Владислав Хакин
Можно и в бд строчку записать - взял лок на такой ...

Надеюсь речь идёт про транзакции? Или вы про NoSql key-value базы говорите?

Владислав-Хакин Автор вопроса
Aleksandr
Надеюсь речь идёт про транзакции? Или вы про NoSql...

Я вцелом про распределенные локи(и другие примитивы - leader election, disovery - тут все понятно) и кто как их использует. Или может в микросервисах они вообще не нужны (у нас монолит)

Владислав-Хакин Автор вопроса
Evgenii Eliseev
lock table 😂

Ну как вариант 😂

Владислав Хакин
Я вцелом про распределенные локи(и другие примитив...

С ними кстати много приколов. Например, если это какой-нибудь Redis с TTL механизмом, то можно запросто набить себе шишок, надеюсь понимаете о чём я 😅

Владислав-Хакин Автор вопроса
Aleksandr
С ними кстати много приколов. Например, если это к...

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

Владислав Хакин
Ну про консистентность редиса немного слышал, поэт...

Не не, не про это, а про то, что фактически легко напороться на гонку. Когда один поток инстанса A подзавис, но не отпустил блокировку, при этом из-за TTL блокировка снята, а второй поток инстанса B смело пошёл в критическую секцию. Но это если у вас TTL стоит, он может не стоять, но там свои минусы появляются

Aleksandr
Не не, не про это, а про то, что фактически легко ...

чет кажется что лучше лок пропадет чем будет висеть до перезагрузки

Владислав-Хакин Автор вопроса
Aleksandr
Не не, не про это, а про то, что фактически легко ...

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

Evgenii Eliseev
чет кажется что лучше лок пропадет чем будет висет...

Так лок пропадёт, но если критическая секция будет взята "без согласования", то можно напороться на проблемы

Владислав-Хакин Автор вопроса
Aleksandr
Так лок пропадёт, но если критическая секция будет...

Если успешно не снять, транзакцию можно не комитить. Но это простой случай да, отправленное сообщение не вернёшь (но и тут свои есть решения)

Aleksandr
Так лок пропадёт, но если критическая секция будет...

оба варинта конечно проблема. но дэдлок на проде это неприятно

https://medium.com/ayte-io/distributed-locks-semaphores-again-36d35c36b21e tl:dr: you're fucked, гарантии недостижимы by design, есть только торги между теоретическим временем простоя и работоспособностью подвисающей системы или плохой сети; одним внешним сервисом это не решить, внешний сервис хранит стейт, но в приложении все равно должна быть прослойка, дающая ответ, находится ли приложении в критической секции; внешний сервис может быть любым стораджем с CAS операцией; ищите для своих задач алгоритмы, состоящие из идемпотентных действий

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта