2017-03-05 32 views
0

我已经努力了两天了解如何在AMQP上运行后端服务(不使用Web套接字或轮询时,REST API网关应如何向浏览器返回GET请求)。HTTP REST网关AMQP请求响应,没有Web套接字或轮询

已成功RPC'ed AMQP服务(与RabbitMqs reply_to & correlation_id),但与Flask HTTP请求等待我仍然丢失。

gateway.py - 响应处理程序中的HTTP处理程序,超时

def products_get(): 
    def handler(ch=None, method=None, properties=None, body=None): 
     if body: 
      return body 
     return False 

    return_queue = 'products.get.return' 
    broker.channel.queue_declare(return_queue) 
    broker.channel.basic_consume(handler, return_queue) 

    broker.publish(exchange='', routing_key='products.get', body='Request data', properties=pika.BasicProperties(reply_to=return_queue)) 

    now = time.time()   # for timeout. Not having this returns 'no content' immediately 
    while time.time() < now + 1: 
     if handler(): 
      return handler() 
     return 'Time out' 

POST/PUT可以简单地立即发送AMQP的消息,返回200/201/201,并在自己的服务工作步伐。一个单独的REST接口仅用于GET请求似乎不合理,但不知道其他选项。

问候

回答

0

认为你所要求的是“如何执行异步GET请求”。我认为答案是 - 你不能。不应该。其糟糕的做法或糟糕的设计。并没有规模。

你为什么试图从AMQP获取你的GET响应有效载荷?

  • 如果paylaod(响应的内容)可以从某个数据库中提取,只需从该数据库中提取即可。这就是所谓的同步请求。
  • 如果必须在某个后端处理有效负载,请将其发送出去,并且没有请求者等待响应。您可以分配一些ID并让请求者稍后再询问(或者从请求者收集一些回调URL,并在您的后端将其响应发送到不常用的设计时发布响应)。

编辑: 这样,因为你与AMQP支持后端的工作,我会做一些稍微复杂的:产生一个线程,或者在您的前端的进程将不断地从AMQP消耗并在本地或某些数据库中存储结果。并根据您本地存储的数据提供GET结果。如果数据尚不可用,只需返回404即可。理想情况下,您需要重新构建API:将其分解为“后”请求(这将触发后端工作)和“获取”请求(将返回结果如果他们可用)。

+0

Hi @FuzzyAmi。对AMQP后端服务发出同步GET请求之后。这是因为后端服务使用AMQP写入数据库。如果它是用REST编写的,我可以像你说的那样简单地调用它(尽管服务发现)。问候 – user2422819

+0

@ user2422819 - 我从来没有见过像你一起工作的服务在这里,这对我来说毫无意义。 AMQP(和兔子)不是以这种方式使用的,尽管如果你愿意,你肯定会滥用它们来工作。我会在我的答案中添加一些注释。 – FuzzyAmi