Codded

GRPC: обработка ошибок на клиенте

Разрабатывая сервис на GO с GRPC встал вопрос при описании proto файлов "Нужно ли вносить описание ошибки приложения в ответ?". Изначально я так и сделал. Определил новый тип Error и добавил его первым полем во все ответы, получилось так:

message Error {
message Metadata {
string key = 1;
string value = 2
}
string code = 1; // код ошибки, константа
string message = 2; // сообщение об ошибке
string detail = 3; // дополнительные данные об ошибке, пояснения 
repeated Metadata meta = 4; // метаданные в виде ключ=значение
}
message ConfigStatusAnswer {
// Данные ошибки. Заполнено в случае ошибки выполнения запроса
Error error = 1;
// дата последнего изменения конфигурации
google.protobuf.Timestamp last_changed_time = 2;
// контрольная сумма конфигурации (опционально)
string checksum = 3;
}

Вроде бы логично. Но я решил все таки посмотреть, как это рекомендуют делать разработчики gRPC.
Оказалось они предлагают не вносить это информацию в каждый ответ, а вписывать ее в метаданные и оттуда клиент их должен достать. Меня интерисовало также как это будет выглядеть в коде на TypeScript, т.к. мы используем Improbable grpc-web для публикации API и он умеет работать с TypeScript. В нашем проекте один из клиентов это одностраничик (SPA) на Vuejs, похоже на это пример в статье "A TODO app using grpc-web and Vue.js (12.2018)"

Как же создавать ошибки на сервере (Go) и обрабатывать их на клиенте (TypeScript) тогда?

Collapse )
Codded

Visual Studio Code: мои настройки

Я начал исползовать Visual Studio Code, когда два года назад начал изучать язык программирования GO.
Сначала эта среда мне не очен понравилась, не было панели нструментов, кнопки Запустить, да еще и на 32 разрядной Windows нельзя установить отладчик для GO. Поработав в ней я привык и даже считаю ее удобной.
Конечно не все поддерживается из коробки, но расширения с успехом удовлетворяют дополнительные потребности.

Для работы использую тему "Material Theme" - у нее плюс втом, что область кода выделяется более контрастно, в то время как у других элементов шрифт более приглушенный.

Также классная вешь Zen Mode, когда редактор открывается в полный экран и скрывается все кроме кода, он отцентрирован посередине экрана - ничего не отвлекает.

Подключаю шрифт с лигатурами Fira Code. В настройках задать его:
"editor.fontFamily": "Fira Code",
"editor.fontLigatures": true


Я использую следующие расширения VS CodeCollapse )

Codded

GoLang: код, который растет с изяществом

Прочитал статью-презентацию Andrew Gerrand "Go: code that grows with grace" https://talks.golang.org/2012/chat.slide 2012 год

В ней даны примеры постепенного внесений нового функуионала в программу на GO. Как это можно делать без усложнения кода.
Примеры в основном затрагивают работу с сетью по TCP, HTTP, Websocket на примере приложения ЧатРулетка, где каждый подключившийся соединяется со следующим первым подключившимся.
В коде можно увидеть, как подключение к серверу сделано по TCP, HTTP, Websocket. Как одновременно в одном сервере можно обрабатывать сообщеия по TCP и WebSocket. Как интерфейсы упрощают переиспользование и работу с кодом разных классов. При этом показывается модель конкурентного исполнения при помощи горутин и взаимодействие через каналы. В примере даже добавляют чат бота на основе цепей Маркова, который будет выдавать фразы и отвечать, если к человеку не подсоединился партнер в течении заданного интервала времени.

Серьёзно о главном

GoLang: продвинутые техники для конкурентного программирования

Просмотрел видео "Google I/O 2013 - Advanced Go Concurrency Patterns" https://www.youtube.com/watch?v=QDDwwePbDtw
Что стоит запомнить и применить?

1. Техника  "цикл for-select"
2. Техника "Служебный канал, канал для ответа (chan chan error)"
3. Техника  "nil-каналы в выражениях select для временной приостановки"
4. Используйте инструменты для обнаружения состояния гонки данных (data race, флаг -race) и взаимоблокировок.

На видео описывется три ошбики к коде с конкурентным исполнением (1 - состояние гонки при обращении к данным / решение (канал с каналом для отчетов/ошибок), 2-приостановка цикла из-за Sleep / Решение (делаем задержку по готовности канала), 3-цикл может заблокироваться навсегда если нет данных в канале) и способы их решения приведенными техниками.

Также даны несколько техник улучшения работы главного цикла обработки:

  1. Дедупликация заданий для дочерних элементов перед их исполнением в горутине (код на видео, фильтрация через map уже обработанных ранее заданий)

  2. Как приостановить выборку заданий, если их уже слишком много в очереди (код в видео, использет технику 3)

  3. Как сделать основную процедуру получения данных неблокируемой (код в видео, создает канал для результатов, техника 2)

Collapse )
Codded

GoLang: Модули Go в реальной жизни

Прочитал статью Go Modules In Real Life (Chip Keyes, 06.2019г.). В ней описываются ситуации нюансы использования модулей GO в разработке.Модули Go появились с версии 1.11 и позволяют уйти от жесткой привязке к GOPATH. Чем же еще это полезно и как и когда их использовать?

Краткая выжимка:

1. Модуль — это коллекция пакетов GO объединенных в одну общую единицу.
Collapse )
Codded

Работа со строками в GoLang — fmt.Sprintf или strconv?

Прочитав Bad Go: frivolous Sprintf (2019 год) вот что понял:

1) fmt.Sprintf — хорошо и удобно, но если надо быстро — используй strconv.Format* и другие его методы. Оно меньше памяти потребляет и работает почти в 4 раза быстрее с выводом. 

2) fmt.Sprintf — тратит время на разбор формата из первого аргумента. 

3)Когда используете fmt.Sprintf  формируйте все строку сразу, т.к. Sprintf для кусочков и конкатенация — это дополнительное выделение памяти и это замедляет.


Codded

7 незаметных подводных камней в языке Go

1. Размеры Int могут меняться в зависимости от разрядности. Так что ваш код может перестать работать на 32 разрядной машине, банально вызывая переполнение.

Эту ошибку можно увидеть в построителе парсеров языка antlr4 - разработчики просто не учли, что люди пользуются еще 32-разрядными системами, в итоге код на 32-разрядной ОС не работает из-за меншего размера Int вызывая переполнение.

2. Осторожнее с приведением типов к типам указателям. Указатель на тип — это не сам тип, тут не будет разыменовывание работать автоматически.

Пример:
f { ... return nil, NotFoundError } err = f()
if _, ok := err.(*NotFoundError); ok { // ... } // это не сработает!

Используйте лучше подход стандартной библиотеки GO — проверка ошибок не по типу, а по назначению, см. os.IsExist(error) и os.IsPermission(error).

Collapse )Collapse )
Серьёзно о главном

Интерфейсы и композиция для эффективного тестирования программ на языке Go

Оригинал: nathan leclaire, https://nathanleclaire.com/blog/2015/10/10/interfaces-and-composition-for-effective-unit-testing-in-golang/ 10.10.2015

К чему призывает автор:

1. Используйте интерфейсы GO — это удобно в работе, широко используется в стандартной библиотеке, и упрощает тестирование, избавляя от использование mock и stub библиотек.

2. Составляйте высокоуровневые интерфейсы через композицию (встраивание).

3. Будьте хорошо знакомы с go test и пакетом testing

Где, как применить?

Collapse )