В проекте реального времени у меня есть стандартный интерфейсный сервис, основанный на событиях, получающий сообщения от брокера очереди сообщений. Этот сервис предназначен для предоставления немногим другим соответствующей информации. По сути, эта служба зацикливается на методе приема, демонтирует пакет (например, protobuf), обновляет / контролирует несколько параметров, выполняет маршалирование в другой формат (например, JSON), а затем pu sh в следующую службу.
Вопрос заключается в следующем: как запустить goroutine для наиболее эффективной общей пропускной способности, с приоритетом для входящих данных?
Сегодня моя точка зрения заключается в том, что наиболее трудоемкой операцией является процесс демаршаллинга / маршаллинга. Таким образом, я бы запустил goroutine следующим образом после получения любых событий (для которых не требуется ACK):
[...]
var rcvBuffer []byte
for {
err := evt.Receive(ctx, rcvBuffer)
go convertAndPush(rcvBuffer)
}
[...]
func convertAndPush(rcvBuffer []byte) {
// unmarshall rcvBuffer
// control
// marshall to JSONpack
JSONpack := json.Marshal(rcvBuffer)
// fan out to another goroutine communicating with other services...
pushch <- JSONpack
}
Я сосредоточен на получении пакетов, а не на блокировке процессора из-за запросов ввода-вывода (либо в - или нет), а не блокирование ввода-вывода из-за самых дорогостоящих операций моего приложения, выполняемых ЦП.
Является ли такой способ разработки приложения правильным? Чего мне не хватать?
btw, Функция приема сообщений не запускает процедуру.