Иногда требуется запланировать выполнение кода на определенное время после происшествия какого-то события. Или сказать, что некий код выполняется снова и снова с заданным интервалом времени. Если в вашем проекте используется Akka, то вы можете решать такие задачи просто элементарно… на самом деле нет. Как мы скоро убедимся, даже здесь есть определенные тонкости.
Примем за рабочую теорию, что вы знаете, что такое Disqus. На сайты эта штука, как правило, устанавливается путем размещения небольшого JS-кода. Есть также плагины для различных CMS, но по моему опыту, они тормозные и пользоваться ими нельзя. В итоге складывается нехорошая ситуация — комментарии на сайте есть, а поисковыми системами они индексируются либо очень плохо (Google), либо вообще никак (всеми остальными ПС).
Помните, как мы учились писать сайтики при помощи Play Framework? Вы, конечно же, обратили внимание, что вопрос работы с какой-либо СУБД был оставлен в стороне. Пришло время исправить эту вопиющую несправедливость!
Проблема с ООП заключается в том, что этим термином сейчас называют все что угодно. Привязал методы к хэшу в Perl — ООП. Наплодил в Erlang процессов, которые обмениваются сообщениями — ООП. Объявил пару-тройку функций для работы с какой-то структурой, и снова ООП. Никто уже толком не понимает, что именно сей термин означает, но все с умным видом его произносят. Стыдно же не знать!
Как нам с вами известно из опыта программирования на Erlang, при работе с акторами иногда могут возникать дэдлоки. Актор А1 шлет запрос с помощью gen_server::call
актору А2, тот в свою очередь спрашивает что-то у А1, но А1 ему не отвечает, так как сам еще ждет ответа от А2. Дэдлок, отваливаемся по таймауту. К счастью, когда вы сталкиваетесь с этой проблемой, в логах есть стектрейсы, позволяющие легко диагностировать и исправить ошибку. Так вот, а совсем недавно я узнал, что в Akka дэдлок в этом случае не произойдет… за исключением одного граничного случая, о котором будет рассказано далее.
Rust — это язык программирования общего назначения от компании Mozilla, разрабатываемый с 2010-го года. Разработчики Rust ставят перед собой задачу с одной стороны достичь производительности C/C++ (все же понимают, DSL’ем для разработки какого браузера является Rust?), а с другой — умудриться сделать язык высокоуровневым и безопасным. К окончанию 2014-го года планируется выпустить бета-версию Rust 1.0. Если все пойдет хорошо, нас ждет релиз Rust 1.0, после чего Mozilla обещает перестать ломать обратную совместимость.
Play Framework — это MVC веб-фреймворк для языков программирования Java и Scala от компании Typesafe. С одной стороны, Play обладает гибкостью и простотой в использовании фреймворков типа Django или Mojolicious, с другой — в нем реализованы многие идеи, например, компилируемость, а следовательно и высокая производительность, строгая статическая типизация и тд, которые мы можем наблюдать, скажем, в Yesod.
Akka — это библиотека для языков Java и Scala, в которой реализованы агенты, акторы, взаимодействие между акторами по сети и многие другие удобняшки. В первом приближении это напоминает Erlang или Cloud Haskell, но на самом деле Akka куда мощнее. Например, с помощью Akka можно легко объединить несколько машин в кластер, в котором будет отслеживаться исчезновение и появление машин, а акторы будут автоматически перемещаться с машины на машину по мере изменения размеров кластера. И это только один из примеров. В этой заметке мы напишем очень простое приложение, использующее Akka, чтобы показать, насколько легко работать с этой библиотекой.
Очень трудно обслуживать 10 000 TCP соединений, если на каждое соединение вы создаете процесс или нитку операционной системы. Вот почему в Erlang есть акторы, в Go и Haskell — легковесные процессы, в Clojure — core.async и pulsar, а в OCaml — LWT. Для решения аналогичных проблем в Scala есть футуры.
Однажды я потратил два дня на поиск и исправление одного идиотского бага. В системе было множество сущностей, которые временами сохранялись в базу и имели id. Были разные функции для работы с этими сущностями. Функции также ходили в базу и зачастую принимали в качестве аргументов id сущностей. Баг заключался в том, что в результате некогда проведенного рефакторинга изменился порядок аргументов и id стали передаваться в неправильном порядке.