Перевод статьи из официального блога компании Basecamp (создателей Ruby on Rails) о том, как Go используется в их компании.

Basecamp это компания, полностью завязанная на Ruby. Все наши клиентские приложения написаны на Ruby on Rails, мы используем Ruby для автоматизации с помощью Chef, мы деплоим с помощью Ruby через Capistrano, и для почти любой задачи вы найдете у нас Ruby скрипт, который делает эту работу.

В тоже время, всё больше и больше, язык Go занял место среди наших бекенд-сервисов и инфраструктуры различными способами.



  • Наш демон для получения и хранения данных был переписан с Ruby на Go в январе 2013
  • Наши скрипты сборки Ruby собирают новые Ruby пакеты на наших серверах с помощью Docker
  • Наша система разбора и хранения логов пишет в Kafka, HDFS и HBase с помощью набора Go программ
  • Мы бэкапим наши DNS записи из Dynect утилитой, написанной на Go
  • Мы держим мульти-мастер инсталляцию Nagios с помощью утилит на Go
  • Мы поддерживаем наши GitHub пост-коммит хуки (post commit hooks) с помощью программы на Go
  • Серверная часть нашей трекинговой системы, мониторящей пользователей и просмотры страниц в реальном времени, полностью написана на Go
  • Мы регулярно скачиваем, расшифровываем и проверяем целостность наших бекапов баз данных с помощью программы на Go

При этом есть еще множество экспериментов на Go, которые ещё не попали в продакшн: поддержка нескольких memcached инстансов в синхронизации из дампов пакетов (?), отдача Campfire через вебсокеты, упаковка наших Rails приложений в докер-контейнеры и другие. Мы также очень активно используем сторонние Go приложения (etcd и sentinel), которые обеспечивают нам фейловер между датацентрами.

Наше использование Go очень естественно. Мы не сели в один прекрасный день и не решили — давайте его использовать. Люди просто брали и начинали писать новые вещи на Go.

Лично мне Go нравится благодаря семантике каналов и горутин, которые очень удобны для программ, обрабатывающих данные, а присущая Go программам производительность означает, что мне не нужно переживать, что мой парсер нагрузит сильно сервер. На самом же языке очень приятно писать код — простой синтаксис, отличная стандартная библиотека, легко рефакторить. Я спросил нескольких наших людей, почему им нравится Go:

Уилл: Go просто отличная находка для Ops задач. Обработка ошибок очень естественно вписалась в то, как я хочу писать системный софт, и при этом код эффективно умеет использовать многоядерность, и делает это всё лучше и лучше с каждым релизом. Также очень простой деплой, и там где раньше мне нужно было думать, как упаковать зависимости и сконфигурить версии Ruby, теперь я могу просто залить бинарник

Тейлор: Когда вы учите новый язык программирования, рано или поздно приходит момент, когда вы пытаетесь решить реальную проблему и тем самым углубить свои познания в языке и его сильных сторонах. Отличнейшая документация Go, простота тестирования и деплоя (скомпилировать раз и запускать где угодно один бинарник) позволяют даже новичку писать производительный и надежный софт практически с самого начала. Там где вы можете провести часы отлаживая баг многопоточности в вашей программе на Ruby, вы можете потратить минуты, переписав это на Go с помощью каналов, которые вот просто работают. И даже для простых скриптов, которым нужна конкурентность — это огромный выигрыш.

Конечно, вы вряд ли когда либо увидите полностью переписанный на Go вариант Basecamp, но Go абсолютно точно занял прочное место в нашей инфраструктуре, и вряд ли его покинет.

Если вы никогда не пробовали Go, попробуйте прямо сегодня!

Комментарии (24)


  1. chuikoffru
    01.09.2015 11:31
    +7

    Мне уже во сне этот гоу мерещится, пиарят его так, хочется попробовать, но сажусь после nodejs, смотрю на синтаксис, смотрю на обилие возможностей, и откладываю, не знаю как подобраться, сделать чего полезного.


  1. Mox
    01.09.2015 13:35
    +1

    Вот бы эти чуваки что-то типа Rails сделали для Go.


    1. Leshrac
      01.09.2015 15:02

      Так уже есть Martini, Gin, Revel


      1. mukizu
        01.09.2015 16:18

        Gin не видел, а Мартини (его не забросили?) и Revel это как-то совсем не RoR


        1. Leshrac
          01.09.2015 16:42

          ну с RoR вообще так навскидку (не только на Go) вряд ли что смог бы сравнить, поэтому привел примеры веб-фреймворков, которые на Go успел посмотреть


          1. mukizu
            01.09.2015 16:44

            Ну, навскидку есть Django :)

            А все что пока видел на Go — это скорее аналоги Sinatra\Flask и иже с ними


        1. Alexeyco
          01.09.2015 17:58

          Revel — как раз и есть попытка сделать RoR на Go. Это-то и печально, т.к. большая часть всего, что нужно среднестатистическому приложению — уже есть внутри Go. Достаточно все это только обернуть во что-то, более удобное (gorm, gin), и будет счастье.

          Если не секрет, чего такого вам не хватает в gorm + gin, без чего никак не обойтись? Автомиграции? Есть в gorm… Шаблонизатор? Есть сразу, из коробки. Библиотека для работы с http — сразу и внутри. Юниттесты? Даже, блин, xml/html парсинг — и тот вкрячили. Управление зависимостями? Есть. Даже китайских хипстеров уже завезли.


          1. mukizu
            01.09.2015 21:45
            +1

            >никак не обойтись

            Плюс рельс не в том, что там есть что-то, чего ни у кого больше нет, а в т.н. «магии». Минимум манипуляций и вот этого «оборачивания» итп — максимум результата.


            1. Alexeyco
              02.09.2015 10:12

              То есть, как всегда — ничего конкретного. «Не нравится, и все»… и все.


              1. mukizu
                02.09.2015 11:52

                Какой конкретики вам хочется услышать? Я выразился предельно понятно, как мне кажется — плюс или особенность рельс, если хотите, не в том, что они позволяют делать что-то особенное, а в том как они позволяют это делать*. Если вы с ними знакомы, то я не думаю, что мне надо объяснять о чем идет речь.

                * — минимум кода при максимуме результата.


          1. olebedev
            11.09.2015 09:33

            Revel — попытка сделать Play Framework.
            А вот Beego что то вроде Django/RoR.


  1. googol
    01.09.2015 16:45
    +1

    Если уж им нужна производительность чего они тот же Crystal не пробуют? github.com/manastech/crystal

    Рубишный синтаксис и скорость бинарников выше чем у того же Go. По мне так идеальный компаньон для Руби.


    1. matiouchkine
      01.09.2015 16:51

      Им нужна скорость разработки, а не производительность. Они не с руби на го уходят, насколько я понял, а с шелла.


      1. googol
        01.09.2015 20:19
        -1

        И даже в таком случае логично использовать Ruby-подобный язык. Тем более Crystal отлично подходит для написания утилит.


        1. matiouchkine
          01.09.2015 20:21

          > логично использовать Ruby-подобный язык
          Если честно, я не вижу здесь ничего логичного (как и нелогичного.) Совершенно ортогональные области. И да, я умею и люблю кристал.


    1. Alexeyco
      01.09.2015 17:52
      +3

      Можете дать какую-то ссылку на бенчмарк crystal vs go?


      1. googol
        01.09.2015 20:18

        Навскидку вот github.com/kostya/benchmarks

        На некоторых тестах Crystal делает Go по скорости в несколько раз.


      1. googol
        03.09.2015 20:18

    1. nwalker
      01.09.2015 18:57

      Мне не нравится цитировать самого себя, но:
      «Я не уверен, что стоит писать на языке, автор которого считает, что вызывать сторонние программы в компайл-тайме — норма.»


    1. M0sTH8
      01.09.2015 20:25
      +1

      Crystal Status: The project is in alpha stage.
      Кажется это исчерпывающий ответ на ваш вопрос.


    1. sergeylanz
      03.09.2015 19:21

      crystal быстрый, но если он так же просто в паралленой работе или как 10 лет назад работать одним тредом?


      1. googol
        03.09.2015 20:14

        Насколько я знаю они активно пилят свою библиотеку в сторону использования coroutines. Так что по сути тоже самое что и в Go. Насчет деталей лучше расспросить в рассылке проекта groups.google.com/forum/?fromgroups#!forum/crystal-lang


  1. estum
    02.09.2015 10:49

    И при всем при этом бейскамп до сих пор тормозит как сука и не умеет слать пуши.


    1. AterCattus
      02.09.2015 12:46

      Так он сам (пока?) на RoR.