Как я писал в предыдущих публикациях, у меня был большой перерыв в Erlang и Elixir, но я программировал в них довольно давно. Во время этого перерыва я писал код на Java и C, как и раньше, когда знал Erlang. Теперь в качестве быстрого напоминания я начал читать «Функциональная веб-разработка с помощью Elixir, OTP и Phoenix» и делать то, что в ней написано. Вчера я прошел часть Эликсира, которая сама по себе была приятной. Синтаксис для некоторых странный, мне приятно смотреть и писать. Но сегодня я вернулся к тому, что сложно реализовать в Erlang и Elixir, но что, на мой взгляд, очень важно.

OTP, потому что я говорю об этом, — это Open Telecom Platform — телеком, потому что он был сделан (как Erlang) в Ericsson, но теперь он не должен быть каким-либо образом связан с телекоммуникациями. Это очень интересный способ мышления — в большинстве языков программирования мы думаем, как и когда может произойти сбой программы, и если мы находим какое-то «опасное» место, мы пытаемся поймать его в каком-то специальном синтаксисе. В Ericsson думали по-другому — ошибки и сбои неизбежны, поэтому вместо того, чтобы пытаться отловить все ошибки (что еще можно сделать в Erlang и Elixir), мы можем просто позволить ему слетать, и более того, мы хотимэто быстро рухнет.

Первая мысль, которая приходит на ум: «С какой стати вы хотите, чтобы программа падала?» Но если подумать — если система рухнет сразу, вместо того, чтобы молча ждать большой ошибки, мы можем решить проблему сразу. И самое главное, в OTP есть способы контролировать, живы ли процессы или произошел ли их сбой, и это дает нам способы очень быстро восстановить состояние до последнего известного момента. Есть супервизоры, которые предназначены именно для этого, мы можем указать, если что-то произойдет, мы должны убить всех остальных детей этого супервизора или перезапустить только этот один ребенок — это ключ к отказоустойчивости в Erlang и Elixir.

Но OTP — это нечто большее, чем просто это. Есть и другие «поведения» (Supervisor — это поведение), очень полезные при создании какой-либо системы. Еще одно популярное поведение от OTP — GenServer. Он поставляется с предопределенными функциями — чтобы показать, как мы можем с ним взаимодействовать. Мы можем создавать обращения к серверу, которые будут ждать ответа, мы можем создавать приведения, которые будут работать асинхронно — они не будут ждать ответа.

Все становится еще интереснее, когда мы объединяем пару вещей из OTP вместе, например, мы контролируем, работает ли genserver, если в любой момент он умирает, мы можем сделать новый с тем же состоянием.

Как вы, вероятно, можете сказать, мне еще предстоит пройти долгий путь, чтобы понять и использовать OTP в полной мере, но «никто не сказал, что это будет легко, и он сдержал свое слово».