• 0
    В Wargaming используется микросервисная архитектура, где разные сервисы взаимодействуют между собой как по HTTP-протоколу, так и по AMQP.

    Веб тоже разный бывает. Бывает в монолитном виде "отвалидировать форму, сходить в БД, что-то посчитать, провернуть какие-то бизнес-операции, выплюнуть HTML-ку с данными и менюшками". Обычно так на ранних стадиях проекта работает.
    А когда к проекту начинают прикручивать платёжную систему, рассылку нотификаций на различные устройства, множество методов авторизации, мобильную версию, API, мобильные приложения и пр, то эти задачи реализовываются уже в отдельных приложениях-микросервисах, которые принимают на вход JSON, возвращают JSON и всё. После этого "веб" превращается в тонкую прослойку — пользовательский интерфейс, который хоть на PHP можно писать. Валидатор форм и шаблонизатор.
    Вся остальная "мякота" именно в этих микросервисах.
    Erlang в Wargaming
  • +1
    Можно, наверное, запускать с запасом, а в рантайме менять erlang:system_flag(schedulers_online, N).

    нельзя указать на каком пуле ниток запускать этот драйвер

    Так там всего один пул. Точнее, пул планировщиков и пул IO и dirty schedulers, но драйверы (если ниче не путаю) всегда на пуле планировщиков исполняются (явно скидывая IO в пул IO). Или что имеется в виду?
    Erlang в Wargaming
  • +2
    Похоже она всё же есть
    https://github.com/erlang/otp/blob/maint/erts/emulator/beam/bif.c#L2105

    Если покопаться, то видно, что у процесса списывается редукций 4 * количество сообщений в мейлбоксе получателя.
    Erlang в Wargaming
  • +1
    В Ubuntu вроде даже по умолчанию Baobab установлен image
    Нечто «крадет» место на диске?
  • +1
    Если в твоём языке есть удобный тип данных с поддержкой арифметики, конверсией таймзон, форматированного вывода, то почему нужно его игнорировать?
    С unix timestamp быстро надоест «руками» высчитывать сколько это будет «сейчас плюс один год и три месяца».
    Чему мы научились, разрабатывая backend
  • +1
    По ссылке используется GIN индекс для поиска по произвольному регулярному выражению. Индекс делаешь один раз на колонку, а потом можешь по нему любыми регулярками искать.
    Поиск с помощью регулярных выражений может быть простым и быстрым
  • –2
    Пока для хранения и обработки дат можно использовать unix timestamp, лучше использовать unix timestamp.

    Сомнительный совет как по мне.
    Чему мы научились, разрабатывая backend
  • 0
    Насчет того, что Erlang «достаточно честно использует память» это совсем неправда. У Erlang довольно сложный многослойный аллокатор памяти, так что фрагментация может съедать до 50%.
    Например у меня сейчас запущено приложение, работает около 15 дней, в HTOP отображается 153Мб, изнутри же
    1> memory(total).
    61631088
    

    Т.е. 56Мб всего «полезной нагрузки». Это всё конечно можно подтюнить, но верным ваше утверждение от этого не станет.
    Наш доклад на «Стачке»: «Как избавиться от persistent database зависимости»
  • +1
    Насчёт строчек странное замечание. Можно и так написать, если сильно захотеть

    match File::open(&Path::new("foo.txt")) { Ok(f) => {
            // здесь код, который может работать с файлом с помощью переменной f, к переменной e в этой ветке доступа нет
        } Err(e) => {
            // здесь можно вывести сообщение об ошибке ипользуя переменную e, к переменной f в этой ветке доступа нет
        }
    }
    

    Если пробрасывать ошибку на уровень выше, то ещё короче (обычно так и делают)
    let file = try!(File::open(&Path::new("foo.txt")));
    let line = try!(file.read_line());
    
    Главное преимущество Go
  • +1
    Ну и try!() для проброса ошибки наверх.
    Главное преимущество Go
  • 0
    Зачем их выставлять? Если ping-pong фреймы сервер будет посылать, то соединение может жить сколько угодно.
    WebSocket RPC или как написать живое WEB приложение для браузера
  • +1
    Как full-time erlang программист, готов утверждать, что нет. Не императивный.
    Релиз Rust 1.0 Alpha
  • +1
    А чем не подходит текущий подход к обработке ошибок? Или вам эксепшены надо?
    Релиз Rust 1.0 Alpha
  • 0
    Специально уточнил про «императивные».

    Вы всё-же приведите конкретный пример императивного языка с хорошей, использующейся на практике, поддержкой зелёных тредов. Желательно, умеющих самостоятельно расползаться по ядрам CPU.
    Релиз Rust 1.0 Alpha
  • –2
    Ну вы почитайте ссылку то, там очень подробно расписано почему приняли такое решение. Но в целом меня такое направление движения тоже несколько расстроило. Я надеялся на «Go с нормальной системой типов».

    А какие ещё современные императивные языки, кроме Go, имеют хорошую поддержку зелёных потоков?
    Релиз Rust 1.0 Alpha
  • 0
    Были были. Использовали segmentsged stack github.com/aturon/rfcs/blob/remove-runtime/active/0000-remove-runtime.md.

    В общем, они решили не делать конкурента Go а сделать конкурента С и С++ — без толстых абстракций и рантайма.
    Релиз Rust 1.0 Alpha
  • +1
    discuss.rust-lang.org/ — девелоперский форум. Там можно обсудить разработку Rust.
    Релиз Rust 1.0 Alpha
  • +9
    Стоит отметить, что Rust, который изначально был сделан с уклоном в функциональщину, зелёные потоки и асинхронное IO под капотом, теперь окончательно оформляется в C++ с современной системой типов.
    Возможно это и хорошо, т.к. в функциональные языки он ничего особо нового не привнёс бы, а для C давно уже есть необходимость в современных альтернативах.
    Релиз Rust 1.0 Alpha
  • +3
    В подсистеме io ещё будут полностью менять API до релиза стабильной версии.
    Релиз Rust 1.0 Alpha
  • 0
    Кстати, присоединяюсь к вопросу — этот javascript выполняется не в браузере? Как вообще получается, что JS (который, вроде как в браузере должен работать) получает доступ к ФС и запуску исполняемых файлов? Или это какая-то особенность почтовых клиентов на Windows?
    Вирус-вымогатель CryptoBot сдаёт своих жертв через Twitter
  • +2
    Да не, достаточно удобно. Главное, что если вы функцию опишете как возвращающую что-то, но влепите лишнюю ';', то оно не скомпилируется.

    fn add(a: uint, b: uint) -> uint {
        a + b;
    }
    

    <anon>:5:1: 7:2 error: not all control paths return a value
    <anon>:5 fn add(a: uint, b: uint) -> uint {
    <anon>:6     a + b;
    <anon>:7 }
    <anon>:6:10: 6:11 note: consider removing this semicolon:
    <anon>:6     a + b;
                      ^
    error: aborting due to previous error


    is.gd/9tD5AB — пример.
    Rust на примерах. Часть 2
  • +7
    NodeJS proxy? Omg…
    man iptables не пробовали?
    Безопасное развертывание ElasticSearch сервера
  • +1
    Думаю стоит статью актуализировать: добавить всякие is_map, binary_to_{integer,float}, integer_to_binary, float_to_binary.
    Erlang для самых маленьких. Глава 4: Система типов
  • +3
    К слову, язык Rust тоже не поддерживает исключений, а факт ошибки определяется типом возвращаемого значения. Но Rust поддерживает макросы, и за счёт этого проброс ошибки наверх становится очень лаконичным:

    my_fun(val) — так записывается вызов функции
    my_macro!(val) — так записывается обращение к макросу.

    fn do_smth() -> Result {
        let res1 = try!(do_sub1());
        let res2 = try!(do_sub2());
        return Ok(res1 + res2)
    }
    

    try! — это макрос, после разворота которого функция будет выглядеть так:
    fn do_smth() -> Result {
        let res1 = match do_sub1() {
                      Ok(v) => v,
                      Err(e) => return Err(e)
                   };
        let res2 = match do_sub2() {
                      Ok(v) => v,
                      Err(e) => return Err(e)
                    };
        return Ok(res1 + res2)
    }
    

    Т.е. если do_subX() вернула ошибку, то она возвращается из функции с помощью return, а если вернулось нормальное значение — оно присваивается переменной для дальнейшего использования.
    О плюсах и минусах Go
  • 0
    Ваша история очень похода на мою — я тоже на Erlang на работе пишу пауков уже пару лет (Одного сложного дорабатываю постоянно и штуки 4 помельче). И отчасти я с вами согласен.

    * HTTP клиент lhttpc работает отлично, ни разу проблем не возникало. Использовал 500-800 параллельных потоков в штатном режиме. Особо приятный момент — возможность жёстко ограничить время на скачивание странички — не уложился в 20 секунд — отбой. Но поддержку кукисов пришлось дописать. Помимо lhttpc есть вполне годные hackney и ibrowse.

    * Для парсинга HTML тоже использую mochiweb_html. Даже бенчмарк делал — работает достаточно шустро, быстрее чем парсеры на большинстве динамических языков, по потреблению памяти так вообще почти всех делает. Зачем вы использовали list — строки вместо binary не знаю, видимо по неопытности…

    * Для XPath брал тот же mochiweb_xpath — тут действительно была сильно урезанная версия и пришлось некоторые вещи дописывать — их сейчас влили в апстрим, так что поддержка XPath сейчас практически полная.

    Насчёт zezro-deployment — не совсем понимаю что под этим подразумевается, не могу прокомментировать.
    Насчёт надёжности не понял какие могут быть вопросы.

    Что я получил в замен на свои «мучения»:
    * Приемлемую производительность (первоначальная версия паука на Python + gevent + mongoDB для общих данных выдавала в ~10 раз меньше запросов и хрен поймёшь в каком месте был затык)
    * Возможность подпатчить код без остановки паука (зашел на сервер, сделал nano src/cookie_storage.erl; rebar compile; erl -remsh spider@localhost; l(cookie_storage). и вот уже паук работает на подправленной версии).
    * Удалённый шелл сам по себе отличная штука — можно подключиться к работающему процессу и что-то там посмотреть (включить профилирование / покопаться в памяти / изменить настройки / включить-отключить подсистему). Пользуюсь постоянно.
    * Относительно легко подключать другие языки — у меня к пауку подключены интерпретаторы JS и Python.
    * Выпилил лишние сущности (в Python версии шаренные данные /списки proxy, статистика, cookies etc/ складывали в MongoDB, т.к. gevent по ядрам CPU не умеет расползаться, в Erlang они хранятся прямо в памяти)
    * Сам код стало проще структурировать и поддерживать, т.к. OTP к этому располагает.

    С вебсокетами тоже баловался — вот этот сервис написал полностью на Erlang: http://dropmail.me/ru/ и там самые что ни на есть вебсокеты.
    Как я проект с JavaScript на Scala переписывал
  • 0
    А каких вам лично библиотек не хватило для счастья?
    Как я проект с JavaScript на Scala переписывал
  • +1
    Как в Akka не знаю, в Erlang: Пусть есть акторы A B и C. Коллекцию хранит C. A и B отправят каждый по сообщению C «измени что то», сообщения попадут в мейлбокс C. C прочитает первое сообщение — изменит коллекцию, потом прочитает второе сообщение — ещё раз изменит коллекцию.
    Возможно после изменения отправит в ответ сообщение «я изменил, вот новое значение» — тут уж как запрограммируешь.
    Игровой сервер на Scala + Akka
  • +1
    Кстати, можете пояснить, почему любители Go постоянно упоминают «формальный стандарт» или «спецификацию». Ни от кого больше такого упора на её наличие не встречал.
    У Rust есть doc.rust-lang.org/rust.html — тут весь язык расписан довольно подробно. Крупные публичные проекты на нём уже есть. Сторонних библиотек пока не так много разве что.
    [Перевод] Почему Go не так хорош
  • +1
    * Насчет перегрузки операторов — что изменится, если я напишу (Python)
    def add(self, other):
        return self.val * other.val
    
    o1.add(o2)
    

    вместо
    def __add__(self, other):
        return self.val * other.val
    
    o1 + o2
    

    Оба варианта выглядят как сложение, хотя внутри умножение.

    * Насчёт системы типов — всё-таки приятнее, когда типизация продуманная и РАБОТАЕТ, а не добавлена «для галочки» и страдает дырявостью.

    * Pattern matching — я лично не понимаю что вообще можно иметь против него — штука то крайне удобная (что в Erlang, что в Rust). Сложным бы я его тоже не назвал.
    TJ Holowaychuk: Прощай Node.js
  • +3
    А исходников не будет?

    Сервера уже повыключали? Я бы мог вам на Erlang для сравнения написать аналог.
    Немного тестов производительности сетевых фреймворков
  • 0
    Скажем, аналог описанного в топике решения — скрипт sip_caller.sh <recipient> <path-to-audio-file> и sip_sendim.sh <recipient> <message>.
    Отправка уведомлений Zabbix в скайп (звонки со скайпа — бонусом)
  • 0
    А можете минимальный пример привести? С Астериском не работал.
    Отправка уведомлений Zabbix в скайп (звонки со скайпа — бонусом)
  • 0
    Понятно. Хотел на ней написать звонилку, но так и не смог установить. К сожалению, в репозиториях Ubuntu её нет. Возможно ещё раз попробую.
    Отправка уведомлений Zabbix в скайп (звонки со скайпа — бонусом)
  • 0
    Кстати, буду благодарен, если подкинете годную скриптуемую звонилку по SIP.
    Отправка уведомлений Zabbix в скайп (звонки со скайпа — бонусом)