Как архитектурно организовать поисковый микросервис на golang?
Возникла идея огранизовать поиск по каталогу цифровых товаров как отдельный микросервис на основе Go и Redis. Go выступает как API, смотрящее наружу через реверс-прокси и берущий данные из монги, либо из redis кэша если он есть.
Redis как кэш актуален для "одноядерных" языков вроде node/python/php. Там большие проблемы с многопоточным доступом к памяти, поэтому вместо памяти используют key-value (memcached еще вспомнить можно). А если у вас голанг - так зачем редис? Воспользуйтесь кэшом в памяти, всё еще на порядок быстрее работать станет за счет отсутствия сетевых взаимодействий на кэш-хитах.
Использовать in-memory cache не очень хорошо, вы получите statefull сервис, который будет сложно масштабировать, например запустить 3 инстанса сервиса... будет 3 одинаковых кеша.
А при использовании того-же memcached - сервис будет stateless, его можно будет масштабировать как угодно + из memcached можно делать кластеры.
В общем при масштабировании возможны проблемы.
Хорошим решением в этом случае будет создание интерфейса для сохранения и извлечения данных из кеша. Чтобы можно было использовать in-memory cache, если не указаны настройки memcache :)
Тогда получится вполне гибкое решение.
Все верно. Самая обычная практика.
Только вместо Redis можно и Memcached (быстрее). https://medium.com/@Alibaba_Cloud/redis-vs-memcach...
Использовать in-memory k/v хранилище как советует Сергей Тихонов так же можно, однако в таком случае при перезапуске сервиса (ошибки и т.д.) потеряются данные в кэше и уйдет время на разогрев кэша.