Golang Goroutines разделяют соединение RPC
У меня есть сервер Golang, который обслуживает входящие запросы с выделенной программой. Эти программы будут обращаться к другому back-end серверу, используя rpc / gob. В случае повторного использования соединения, чтобы заставить Gob работать лучше (соединение с совместным использованием запросов может повторно использовать метаданные без повторной отправки, а также сэкономить время для инициации TCP), я думаю о реализации механизма, аналогичного пулу соединений (например, клиентскому пулу mysql), но до этого я пропустил что-нибудь важное?
Есть ли какой-нибудь конкретный способ обработки такого общего RPC-клиента? Или какой-нибудь проект, созданный для решения этой ситуации?
2 ответа
См. https://github.com/valyala/gorpc - эта библиотека идет дальше с оптимизацией RPC - она использует независимые циклы чтения и записи, пакетирование и сжатие сообщений. Он также имеет гораздо более простой API по сравнению с net/rpc .
Переход от rpc на основе http к gorpc в реальном производственном проекте позволил снизить пропускную способность сети RPC с 300 Мбит / с до 24 Мбит / с.
После некоторого исследования я обнаружил, что механизм встроенного пула уже был реализован во встроенной клиентской библиотеке на основе кода по адресу http://golang.org/src/pkg/net/rpc/client.go, но я по-прежнему заинтересован если кто-нибудь может поделиться со мной больше идей.