使用AMQP在Golang中进行JSON RPC

时间:2019-03-25 02:08:15

标签: go rpc amqp

我使用“ github.com/streadway/amqp”通过队列(RabbitMQ)进行异步处理请求。

我使用“ github.com/gorilla/rpc”注册我的服务而没有解决方法,但是我必须使用丑陋的解决方案将amqp.Delivery转换为http.Request(mux.Server只能与http.Request一起使用)

我可以为这个任务使用更优雅的解决方案吗?

我找不到用于AMQP的JSON RPC路由器。

1 个答案:

答案 0 :(得分:1)

首先,RPC和pub-sub(例如AMQP)是两种非常不同的野兽;试图用一个实现另一个不一定是错误的或坏的,但这绝对是可疑的,并且暗示设计中可能存在故障。因此,我强烈建议您从业务目标开始重新考虑设计,并确保要尝试实现的实际上是实现所需功能的正确方法。

也就是说,您所描述的基本上是可能的,但是您想将抽象提升一个层次。尝试通过AMQP发送http.Request正在以某种方式混合协议,这只会导致更多问题。实现此行为的更干净的方法是拥有一个处理http.Request(正常)的HTTP处理程序和一个处理amqp.Delivery(正常)的AMQP处理程序,并具有每个处理程序调用仅在您的域模型中处理的共享业务逻辑处理程序。

因此,您的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,这也不是一个坏主意

我希望至少能为您提供足够的信息,使您在实施过程中处于正确的轨道。祝你好运!