2017-03-05 7 views
0

웹 소켓이나 폴링을 사용하지 않고 REST API 게이트웨이가 AMQP에서 백엔드 서비스를 실행할 때 REST API 게이트웨이가 브라우저에 GET 요청을 반환하는 방법을 이해하기 위해 고생했습니다.).웹 소켓이나 폴링이없는 HTTP REST 게이트웨이

AMQP 서비스 (RabbitMqs reply_to & correlation_id)와 RPC를 성공적으로 연결했지만 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/간단하게 즉시 200/201/201을의 AMQP 메시지를 보낼 반환 할 수 PUT과 자신의 서비스 작업 속도. GET 요청을위한 별도의 REST 인터페이스는 믿기지 않지만 다른 옵션을 모른다.

감사

답변

0

내가 무엇을 요구하는지 것은 "어떻게 비동기 GET 요청을 수행하기 위해"입니다 생각 . 나는 그 대답이 - 당신은 할 수 없다고 생각합니다. 하지 않아야합니다. 그것의 나쁜 연습 또는 나쁜 디자인. 그리고 그것은 확장되지 않습니다.

왜 AMQP에서 GET 응답 페이로드를 가져 오려고합니까?

  • paylaod (응답 내용)를 일부 DB에서 가져올 수 있으면 그냥 거기에서 당깁니다. 이를 동기 요청이라고합니다.
  • 페이로드가 일부 백 엔드에서 처리되어야하는 경우 멀리 보내고 요청자가 응답을 기다리지 않게하십시오. 일부 ID를 할당하고 요청자가 나중에 다시 질문하도록 할 수 있습니다 (또는 요청자로부터 콜백 URL을 수집하고 준비가 덜 된 공통 디자인으로 백엔드 POST에 응답을 보낼 수 있습니다).

편집 : 그래서, 당신은 AMQP 지원을받는 백엔드 작업 할것을, 내가 뭔가 좀 더 정교한 할 것입니다 제공 : 지속적으로 AMQP에서 소비하는 것 스레드 또는 프론트 엔드의 프로세스를 생성 결과를 로컬 또는 일부 db에 저장하십시오. 로컬에 저장 한 데이터를 기반으로 GET 결과를 제공하십시오. 데이터를 아직 사용할 수 없다면 404를 반환하십시오. API를 다시 형상화해야합니다. 즉, "게시"요청 (백엔드에서 작업을 트리거하게 됨)과 "요청"을 반환해야합니다 결과가 나오는 경우).

+0

안녕하세요 @FuzzyAmi. AMQP 백엔드 서비스에 대한 동기식 GET 요청 이후에 더 많은 기능을 제공합니다. 이는 백엔드 서비스가 데이터베이스에 액세스하는 AMQP로 작성되기 때문입니다. 그것이 REST로 작성 되었다면, 당신이 말했듯이, 단순히 (서비스 발견 임에도 불구하고) 그것을 호출 할 수 있습니다. 감사합니다 – user2422819

+0

@ user2422819 - 여기서는 같이 일해야하는 서비스를 본 적이 없으며 거의 ​​이해가되지 않습니다. AMQP (및 토끼)는 이러한 방식으로 사용하도록 고안되지 않았지만, 원한다면 확실히 남용 할 수도 있습니다. 내 대답에 몇 가지 메모를 추가하겠습니다. – FuzzyAmi