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

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

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

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

6 ответов

29 просмотров

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

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

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

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
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
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
Карта сайта