Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go в бою

Go в бою

Использование Go (golang) в production:
- cgo: вызов функций C из Go и Go из C;
- mruby: как встроить интерпретатор;
- тестирование: модульное, системное и нагрузочное;
- управление внешними пакетами: с версиями или без них;
- деплоймент: перезапуск без даунтайма;
- мониторинг: все наши метрики.

Доклад с конференции Стачка! 2013 (http://nastachku.ru/)
Запись: http://live.digicast.ru/ru/view/1760 (c 17:20)

4618c5e97c59abd315cc2d7dc809f8c8?s=128

Alexey Palazhchenko

April 12, 2013
Tweet

Transcript

  1. Go в бою Стачка! 13 12 апреля 2013

  2. express42.com

  3. rubynoname.ru

  4. rubynoname.ru

  5. storage.io • Распределённое отказоустойчивое хранилище • S3-совместимое API • Близко

    к российскому пользователю • Elliptics, nginx • Chef, Zabbix, Fabric • Go
  6. О чём речь? • cgo: вызов C из Go и

    Go из C • mruby: вызов Ruby из Go и Go из Ruby • Тестирование • Управление зависимостями: go get or not go get • Деплоймент • Мониторинг и метрики
  7. cgo • Вызов C из Go и Go из C

    • Простые типы, указатели • struct, enum, union • errno: n, err := C.sqrt(-1) // EDOM • Динамическая и статическая (с 1.1) линковка
  8. cgo github.com/AlekSi/cgo-by-example ! cs := C.CString("Go string") ! csRet :=

    C.f(cs) ! fmt.Printf("fmt: %s\n", ! !!C.GoString(csRet)) ! C.free(unsafe.Pointer(cs)) ! C.free(unsafe.Pointer(csRet))
  9. cgo github.com/express42/elliptics-go !var sum []byte !p := unsafe.Pointer(&sum) !copy( !!key.id.id[:],

    !!*(*[]C.uint8_t)(p) !)
  10. Проблемы cgo • runtime: cgo callback on thread not created

    by Go – очередь с pthread_mutex_t / pthread_cond_t, или Go 1.1 • C.f2(C.f1) – must call C.f1
  11. mruby • mini Ruby (как Lua, но лучше) • Анализ

    и изменение поведения программы на лету
  12. Проблемы mruby • Нет релиза mruby • Только статическая библиотека

    mruby, только динамическая линковка в cgo в Go 1.0 • ld: Assertion failed: (reExportDylibCount != 0)
  13. github.com/AlekSi/gomruby • Жду Go 1.1: статическая линковка в cgo, больше

    возможностей в reflect
  14. Модульные тесты func TestSqrt(t *testing.T) { ! const in, out

    = 4, 2 ! if x := Sqrt(in); x != out { ! ! t.Errorf("Sqrt(%v) = %v, want %v", in, x, out) ! } } • Benchmarks, example • launchpad.net/gocheck
  15. None
  16. «Unit tests are waste.» - James O. "Jim" Coplien

  17. Системные тесты • Тестирование веб-приложения через API • Минимальный setup

    / teardown • Как настоящий пользователь API
  18. Следствия • Простые системные тесты можно использовать для нагрузочного тестирования

    • Запросы и ответы могут быть использованы для документирования API
  19. None
  20. Системные тесты + Go • net на goroutines • HTTP/1.1,

    keep-alive, gzip, chunked encoding, timeouts
  21. github.com/AlekSi/gophers • Пока что приватный :( • Но вы можете

    помочь! :)
  22. go get •Только одна версия – последняя •Стабильность API •Удаление

    кода •go get launchpad.net/ gocheck •Супер просто
  23. github.com/AlekSi/nut • zip-архив • Версионирование (SemVer) • Зависимости

  24. gonuts.io • PyPI, RubyGems.org, NPM, Composer • Установка зависимостей •

    nut удалить нельзя
  25. Реакция сообщества • It has been shown so many times

    why the versioning idea is broken. • Mate, I'm not going to quote urban dictionary to you, but you have to find another name for a versioned package. Nut is not acceptable. (сообщение в группу golang-nuts)
  26. Реакция сообщества • It's annoying to me how few people

    seem to think that dependency management isn't a huge missing piece in the Go tooling. • Would you prefer gonads.io?
  27. Что дальше? • Фиксация зависимостей приложения (bundle lock) • Извлечение

    конкретной ревизии после go get
  28. Деплоймент • Fabric • git checkout, make, копируем статический бинарник,

    symlink current, перезапуск
  29. Zabbix • Комплексное решение • Странный API • порядок полей

    в json важен для zabbix- server • формат чисел важен (%.6f) • не всегда соответствует документации
  30. Zabbix • Хост создаётся до нас • Создаём приложение при

    запуске • Создаём items динамически • Графики, экраны и триггеры создаются руками и копируются на другие хосты
  31. А теперь - слайды!

  32. None
  33. None
  34. None
  35. None
  36. None
  37. Спасибо! • about.me/ alexey.palazhchenko • @paaleksey • github.com/AlekSi • gonuts.io

    • meetup.com/ Golang-Moscow • express42.com • storage.io