Slide 1

Slide 1 text

Горячая перезагрузка кода в Go Юрий Насретдинов nasretdinov@gmail.com nasretdinov@google.com

Slide 2

Slide 2 text

Я работаю SRE в Google, но этот доклад про моё хобби и не связан с моей работой в компании. Все мнения — мои собственные и не являются мнениями компании Google. Disclaimer

Slide 3

Slide 3 text

План • Понятие «горячей перезагрузки» кода • Зачем? • Плагины в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы

Slide 4

Slide 4 text

План • Понятие «горячей перезагрузки» кода • Зачем? • Плагины в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы

Slide 5

Slide 5 text

Горячая перезагрузка / Live Reload

Slide 6

Slide 6 text

Горячая перезагрузка / Live Reload

Slide 7

Slide 7 text

Горячая перезагрузка / Live Reload Горячая перезагрузка кода — обновление кода программы в процессе её исполнения, без потери данных в памяти

Slide 8

Slide 8 text

План • Понятие «горячей перезагрузки» кода • Зачем? • Плагины в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы

Slide 9

Slide 9 text

Зачем? • Ускорение разработки (stateful приложений) • Применение патчей в production

Slide 10

Slide 10 text

План • Понятие «горячей перезагрузки» кода • Зачем? • Плагины в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы

Slide 11

Slide 11 text

Плагины https://golang.org/pkg/plugin/

Slide 12

Slide 12 text

Плагины https://golang.org/pkg/plugin/

Slide 13

Slide 13 text

Плагины https://golang.org/pkg/plugin/

Slide 14

Slide 14 text

Плагины • Всегда пакет main • Нельзя выгрузить из памяти • Код пакетов должен в точности совпадать

Slide 15

Slide 15 text

Плагины • Всегда пакет main • Нельзя выгрузить из памяти • Код пакетов должен в точности совпадать

Slide 16

Slide 16 text

Плагины Живая перезагрузка кода с помощью плагинов невозможна*, расходимся * в том плане, что нельзя собрать тот же пакет с другим кодом и потом загрузить оттуда новую функцию

Slide 17

Slide 17 text

Плагины Но можно же и так: - Скопировать код функции в пакет main. - Собрать плагин. - Остается только каким-то образом подменить реализацию существующей функции...

Slide 18

Slide 18 text

Плагины =>

Slide 19

Slide 19 text

План • Понятие «горячей перезагрузки» кода • Зачем? • Плагины в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы

Slide 20

Slide 20 text

Soft Mocks для Go • Подмена функций и методов «на лету» • Путем переписывания $GOPATH (и $GOROOT)

Slide 21

Slide 21 text

Soft Mocks для Go

Slide 22

Slide 22 text

Soft Mocks для Go • В тело каждой функции вставляется код в начале, который проверяет, не нужно ли выполнить другой код вместо текущего • Для этого создается копия $GOPATH с новым содержимым

Slide 23

Slide 23 text

План • Понятие «горячей перезагрузки» кода • Зачем? • Плагины в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы

Slide 24

Slide 24 text

Ограничения реализации =>

Slide 25

Slide 25 text

Ограничения реализации • Нельзя добавлять новые функции, константы, переменные • Можно только менять код существующих функций/ методов • Код обязан использовать публичные типы • (решаемо) Нельзя ссылаться на глобальные типы / переменные из того же пакета • (решаемо) Код должен жить в $GOPATH

Slide 26

Slide 26 text

План • Понятие «горячей перезагрузки» кода • Зачем? • Плагины в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы

Slide 27

Slide 27 text

Демо

Slide 28

Slide 28 text

Выводы • Понятие «горячей перезагрузки» кода • Зачем? • Плагины в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы

Slide 29

Slide 29 text

Выводы • «Живая перезагрузка» кода в Go возможна, но с оговорками ‣ Не переизобретайте Erlang :) • Open-Source: https://github.com/YuriyNasretdinov/hotreload • Экономия по времени сборки будет не всегда • Не применяйте в production! • Будете применять для разработки?