[Java, Алгоритмы, API, ООП, Браузеры] Как синхронизировать сценарий без транзакций? Штатными средствами Java
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Давайте представим, что вы параноик, и параноик вдвойне, когда дело касается многопоточности. Предположим, что вы делаете backend некого функционала приложения, а приложение переодически дергает на вашем серверы какие-то методы. Все вроде хорошо, но есть одно но. Что если ваш функционал напрямую зависит от каких-либо других данных, того же банального профиля например? Встает вопрос, как гарантировать то, что сценарий отработает именно так, как вы планировали и не будет каких-либо сюрпризов? Транзакции? Да это можно использовать, но что если Вы фантастический параноик и уже представляете как к вам на сервер летит 10 запросов к одному методу от разных клиентов и все строго в одно время. А в этот момент бизнес-логика данного метода завязана на 100500 разных данных. Как всем этим управлять? Можно просто синхронизировать метод и все. Но что если летят еще и те запросы, держать которые нет смысла? Тут уже начинаются костыли. Я пару раз уже задавался подобным вопросом, и были интересно, ведь задача до абсурда простая и повседневная (если вы заботитесь о том, чтобы не было логических багов конечно же :). Сегодня решил подумать, как это можно очень просто и без костылей реализовать. И решение вышло буквально на 100 строк кода.Немного наглядного примераДавайте предположим, что есть водитель и есть пассажир. Водитель не может менять машину до тех пор, пока клиент, например подтверждает поездку. Это что получается, клиент соглашался на поездку с одними характеристиками машины, а по факту у водителя другая машина? Не дела! Можно организовать что-то подобное:
String result = l.lock(new ArrayList<Locker.Item>() {{
add(new Locker.Item(SimpleType.TRIP, 1));
add(new Locker.Item(SimpleType.USER, 2));
}}, () -> {
// Тут выполняем отмену поездки и держим водителя на привязи
// Кстати если кто-то где-то вызовет USER=2 (водитель), то он также будет ждать
// ну или кто-то обратится к поездке TRIP=1
// А если обратится к USER=3, то уже все будет нормально :)
// так как никто не блокировал третьего пользователя :)
return "Тут любой результат :)";
});
Элегантно и просто! :)Исходники тут - https://github.com/GRIDMI/GRIDMI.SyncКамнями не бросаться! :)
===========
Источник:
habr.com
===========
Похожие новости:
- [Алгоритмы, C] Корни разные нужны, корни разные важны
- [Разработка мобильных приложений, ReactJS] Десятикратное улучшение производительности React-приложения (перевод)
- [Разработка веб-сайтов, JavaScript, Программирование, HTML] Webix Datatable. От простой таблицы к сложному приложению
- [.NET, Алгоритмы, C#, Big Data, Математика] MEX (Minimum EXcluded) Алгоритм поиска минимального отсутствующего числа
- [Java, Kotlin] Разгоняем REACTOR
- [JavaScript, Node.JS, Криптовалюты] Как написать пассивный доход: Пишем качественного трейд бота на JS (часть 1)
- [Google Chrome, Интерфейсы, Браузеры, Поисковая оптимизация] Google отказался от экспериментов с сокращением URL-адресов в адресной строке
- [Разработка веб-сайтов, JavaScript, HTML, Видеоконференцсвязь] Как мы интрегрировали Agora SDK в проект
- [Алгоритмы, Машинное обучение, Научно-популярное, Искусственный интеллект] DeepMind: обучения с подкреплением достаточно для достижения «настоящего» ИИ
- [Разработка веб-сайтов, Работа с видео, DevOps, Видеоконференцсвязь] Automatize it, or Docker container delivery for WebRTC
Теги для поиска: #_java, #_algoritmy (Алгоритмы), #_api, #_oop (ООП), #_brauzery (Браузеры), #_java, #_mnogopotochnost (многопоточность), #_sinhronizatsija (синхронизация), #_atomarnost (атомарность), #_tranzaktsii (транзакции), #_java, #_algoritmy (
Алгоритмы
), #_api, #_oop (
ООП
), #_brauzery (
Браузеры
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 13:47
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Давайте представим, что вы параноик, и параноик вдвойне, когда дело касается многопоточности. Предположим, что вы делаете backend некого функционала приложения, а приложение переодически дергает на вашем серверы какие-то методы. Все вроде хорошо, но есть одно но. Что если ваш функционал напрямую зависит от каких-либо других данных, того же банального профиля например? Встает вопрос, как гарантировать то, что сценарий отработает именно так, как вы планировали и не будет каких-либо сюрпризов? Транзакции? Да это можно использовать, но что если Вы фантастический параноик и уже представляете как к вам на сервер летит 10 запросов к одному методу от разных клиентов и все строго в одно время. А в этот момент бизнес-логика данного метода завязана на 100500 разных данных. Как всем этим управлять? Можно просто синхронизировать метод и все. Но что если летят еще и те запросы, держать которые нет смысла? Тут уже начинаются костыли. Я пару раз уже задавался подобным вопросом, и были интересно, ведь задача до абсурда простая и повседневная (если вы заботитесь о том, чтобы не было логических багов конечно же :). Сегодня решил подумать, как это можно очень просто и без костылей реализовать. И решение вышло буквально на 100 строк кода.Немного наглядного примераДавайте предположим, что есть водитель и есть пассажир. Водитель не может менять машину до тех пор, пока клиент, например подтверждает поездку. Это что получается, клиент соглашался на поездку с одними характеристиками машины, а по факту у водителя другая машина? Не дела! Можно организовать что-то подобное: String result = l.lock(new ArrayList<Locker.Item>() {{
add(new Locker.Item(SimpleType.TRIP, 1)); add(new Locker.Item(SimpleType.USER, 2)); }}, () -> { // Тут выполняем отмену поездки и держим водителя на привязи // Кстати если кто-то где-то вызовет USER=2 (водитель), то он также будет ждать // ну или кто-то обратится к поездке TRIP=1 // А если обратится к USER=3, то уже все будет нормально :) // так как никто не блокировал третьего пользователя :) return "Тут любой результат :)"; }); =========== Источник: habr.com =========== Похожие новости:
Алгоритмы ), #_api, #_oop ( ООП ), #_brauzery ( Браузеры ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 13:47
Часовой пояс: UTC + 5