2017-03-05 64 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