Комментарии 11
Согласен с вами, статья получилась очень ограниченной. Она раскрывает только один маленький аспект проектирования middleware на Golang
Полный код приведен в репозитории.
Метод Process будет таким образом бесконечно прирастать if'ами и увеличивать таким образом цикломатическую сложность? Я, конечно, понимаю, что в реальных проектах всякое бывает, но зачем же это тащить как пример? К тому же ваш код слишком изобилует частностями из вашего проекта, что лишний раз показывает, что выбранный подход неуниверсален. Я бы рекомендовал вам подумать над универсализацией решения, оформления его в библиотеку на github и потом уже попробовать снова создать пост на хабре.
P. S. И да, как верно выше отметили, попутно ознакомьтесь с концепцией middleware.
Чтобы снизить цикломатическую сложность кода, все If сделаны без вложений с многочисленными точками выхода.
В примере метод Process содержит то, что по минимуму необходимо. Сложно представить проект в котором бы не было аутентификации, токенов, или не было бы потребности в периодическом логировании HTTP трафика.
Полный код приведен в репозитории.
Только заказчик не захотел поддерживать и сопровождать еще один сервер приложений.
Поэтому и появилась эта статья — все что нужно можно легко сделать на Golang без использования дополнительных серверов приложений.
Но вариант без сторонних библиотек показал выше производительность.
Удалось получить до 15 000 [#/sec] с одного физического ядра.
Для простых задач описанный вариант отлично подходит.
Например, в таком варианте был реализован REST API к IBM MQ
Но вариант без сторонних библиотек показал выше производительность.
Удалось получить до 15 000 [#/sec] с одного физического ядра.
И что, 10k rps с ядра вас вас бы не устроил? какая у вас текущая нагрузка?
Если ваш вопрос "по текущей нагрузке", относится к REST API к IBM MQ, то там не нужно было более 1000 rps.
Там проблема с производительностью была в другом – каждое XML сообщение нужно было нормализовать (канонизация) по стандарту RFC 3076, завернуть его в транспортный пакет и посчитать для всего пакета HMAC с хэш-функцией ГОСТ-34.11.94.
Упрощаем написание HTTP обработчиков на Golang