JSON RPC на Голанге с AMQP - PullRequest
       27

JSON RPC на Голанге с AMQP

1 голос
/ 25 марта 2019

Я использую «github.com/streadway/amqp» для асинхронной обработки запросов через очередь (RabbitMQ).

И я использую "github.com/gorilla/rpc", чтобы зарегистрировать свой сервис без обходного пути, но мне нужно использовать некрасивое решение для преобразования amqp. Доставка в http.Request (mux.Server может работать только с http.Request). .

Могу ли я использовать более элегантное решение для этой задачи?

Я не могу найти маршрутизатор JSON RPC для AMQP.

1 Ответ

1 голос
/ 25 марта 2019

Во-первых, RPC и pub-sub (например, AMQP) - это два очень разных звери;попытка использовать одно для реализации другого не обязательно является неправильной или плохой, но это определенно подозрительно и подразумевает, что где-то в проекте может произойти сбой.Поэтому я настоятельно рекомендую пересмотреть проект, исходя из ваших бизнес-целей, и убедиться, что то, что вы пытаетесь реализовать, на самом деле является правильным способом достижения желаемой функциональности.

Тем не менее, то, что вы описываете, этов принципе возможно, но вы хотите поднять свою абстракцию на уровень выше.Попытка отправить http.Request через AMQP - это микширование протоколов таким образом, что это только приведет к большему количеству проблем.Более чистым способом реализации этого поведения было бы иметь обработчик HTTP, который обрабатывает http.Request с (как обычно), и обработчик AMQP, который обрабатывает amqp.Delivery с (как обычно), и каждый из этих обработчиков вызывает общий бизнеслогический обработчик, который работает только в модели вашего домена.

Итак, ваш обработчик HTTP проанализирует HTTP-запрос и превратит его в объект домена - вы не дадите никаких конкретных деталей в вопросе, поэтому я придумаючто-то вроде myapp.UserRegistration.Ваш обработчик HTTP передаст это в myapp.UserService, который будет обрабатывать фактическую бизнес-логику регистрации пользователя, он вернет результат, который вы затем преобразуете в соответствующий тип, выполните маршалинг в JSON и отправите обратно клиенту вhttp.Response.myapp.UserService не будет ничего знать о HTTP или AMQP;он работает только на ваших типах доменов.

Ваш обработчик AMQP получит сообщение, проанализирует его в тот же тип myapp.UserRegistration, передаст его тому же обработчику myapp.UserService,и получить тот же ответ обратно - гарантируя, что бизнес-логика для AMQP и HTTP ведет себя одинаково.Тогда вы получите ответ, и ... ну, это AMQP, поэтому вы не можете отправить ответ клиенту.Я не знаю ваших настроек, может быть, у вас есть другая очередь, в которую вы можете отправить ответ обратно, может быть, вы не заботитесь о ответе и можете отменить его.Именно здесь разница между RPC и AMQP наиболее очевидна.

Это также делает вашу бизнес-логику, обработчик HTTP и обработчик AMQP более тестируемыми в изоляции, поскольку вы отделяете логику протокола от бизнес-логики, чтоможет быть полезным, даже если вы не пытаетесь работать с несколькими протоколами (т. е. это не плохая идея, даже если вы используете только HTTP)

Я надеюсь, что, по крайней мере, вы получите достаточно информации, чтобы поставить вас направильный путь в вашей реализации.Удачи!

...