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

@Y0zhig @shizzard А можно я опишу цель и может вообще

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

Но как быть если задачу уже повзаимодействовала с внешним миром. Условно по tcp что-то отправила, сохранила ответ в переменную и упала?
Можно ли как то продолжить выполнение с этой точки в случае падения. И можно ли если упала вся нода кластера?

6 ответов

25 просмотров

Есть библиотеки которые это успешно делают. Но тут же всегда вопрос в том, что делать когда ты продвинулся дальше результата, какая нода будет исполнять с чекпоинта, как часто делать чекпоинт Как я понял, нужно чтобы контекст выполнения сохранялся при падении и потом исполнялся в другом месте (по возможности). Во-первых, это физически невозможно. Отказы бывают не только багами в коде, а бывают багами в рантайме, багами в ядре и просто выдернутой розеткой. Поэтому условный подход "ловить exception и сохранять стек" тут не работает в принципе. Во-вторых, перенести исполнение на другую ноду не возможно если, как вы пишете, вы читаете из TCP сокета. Сокеты привязаны к конкретному инстансу обычно. Можно попробовать поставить прокси перед сокетами и читать из разных инстансов, но это очень ненадёжно, потому что, во время передачи сокета другой ноде, клиент может просто отключиться. Но есть варианты, которые реализуют некоторый durability для вычислений и возможность исполнять их на разных нодах. Правда все эти либы на Elixir, но это считайте почти Erlang 1. Machinery. Это стейтфул акторы. То есть там все фичи обычных акторов Erlang, только они ещё транзакционно обновляют переходы между состояниями. Можно запустить такой под global (или swarm/horde/gproc/syn), например, и тогда при падении на одной ноде, он будет запускаться на соседней из стейта в базе. Для сценария передачи TCP сокета тут надо будет только самим реализовать общение с proxy и всё. 2. Oban. Это persistent job queue. То есть ты просто описываешь задачки, и они исполняются где-то в кластере. Тут уже сложнее смоделировать вашу задачу, но всё равно возможно, если описать взаимодействие с сокетом как последовательность задачек.

Да такой прокси совсем не сложно и на Erlang/Elixir сделать. Я говорил только что готового решения нет

beam - виртуальная машина легковесных процессов обменивающихся сообщениями. erlang - функционально-образный язык управления этой виртуальной машиной

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
Подскажите, а есть vault lite или ченить такое?) А то нужен вольт для похода в вольт, но весит он ~500 мб) как-то многовато для парочки запросов ))
Alexandr Orloff
17
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Карта сайта