2011-06-10 58 views
12

我正在構建一個通過CarrierWave處理文件上傳的Rails應用程序。目前,較大的文件上傳會阻塞服務器很長一段時間。我看到了像s3-swf-upload-plugin gem這樣的解決方案,它跳過本地服務器並直接從瀏覽器發送文件到S3,但這需要進行一些修改以預先生成唯一的文件名並將它們與數據庫同步。我相信這不會太麻煩,但Heroku的新Cedar堆棧讓我想到將這些長時間運行的請求卸載到在同一應用程序中運行的node.js實例。我對這些事情並不是很有經驗,所以如果有點不合適,請原諒我的措詞。在Heroku上的同一個應用程序中的Rails和Node?

會是這樣的事情嗎?你將如何配置某些請求(在這種情況下涉及文件上載的請求)將由與主軌應用程序捆綁在同一個heroku存儲庫中的節點應用程序處理?

+0

您是否考慮過爲獨立的heroku應用程序上傳? – Elad 2011-06-11 07:00:21

+0

即使他們在不同的實例上,我認爲這個問題仍然適用於如何將它們集成在一起。另外,我不確定兩個獨立的heroku應用程序之間如何共享數據庫。 – Luke 2011-06-12 18:28:20

+0

您可以從ENV ['DATABASE_URL']獲取數據庫連接字符串,並且您應該可以在第二個應用程序中使用它。實際上,使用專用數據庫,您甚至可以從heroku以外的應用程序訪問它:http://devcenter.heroku.com/articles/external-database-access – Elad 2011-06-12 18:44:12

回答

8

我不認爲有可能在同一個應用程序中混合使用Rails和Node。但是,通過使用兩個彼此通信的獨立應用程序,您可以獲得大致相同的功能。

您可以使用ENV ['DATABASE_URL']來確定您的數據庫連接字符串。使用heroku控制檯將它設置爲Node應用程序的ENV變量(例如,heroku config:add OTHER_DB=your_connection_string)應該能夠使用相同的連接字符串從您的其他heroku應用程序連接到相同的數據庫。如果您擁有專用數據庫,您甚至可以在heroku之外訪問它,請參閱:http://devcenter.heroku.com/articles/external-database-access

對於兩個應用程序之間的無縫集成,您可以將Rails應用程序發佈的表單呈現給Node應用程序的URL。除了文件上傳之外,還需要通過隱藏的輸入字段在該表單中包含任何需要與Node應用程序通信的其他變量。當上傳到Node應用程序完成後,它可以將客戶端重定向回Rails應用程序,將任何狀態或變量作爲get參數傳遞。

在同一個域的兩個子域下運行這兩個應用程序,甚至可以在它們之間共享cookie。

+0

謝謝,這是非常有幫助 – Luke 2011-06-14 15:46:08

+0

我不明白爲什麼rails應用程序發佈到節點應用程序的URL。爲什麼不從節點調用Rails URL來獲取HTML? – Tony 2012-02-21 13:33:51

+0

我想你也可以這樣做...... – Elad 2012-02-22 12:58:00

2

您需要兩個應用程序。我正在做這個問題中所描述的。我想要大量的流媒體上傳,並且由於Rack在將文件傳遞給處理程序之前將下載文件寫入臨時文件,因此無法使用Rails進行此操作。

另一方面,Node.js可以很好地完成這項工作。所以有兩個Heroku應用程序,Rails Web應用程序和Node.js(Express)Web應用程序。 Rails web應用程序使用SWFUpload作爲客戶端解決方案。 Rails應用程序和Node.js應用程序都有一個密鑰,作爲Heroku配置變量。當用戶上傳時,客戶端JavaScript請求來自Rails服務器的上傳URL。 Rails服務器形成一個帶有Expires參數的上傳URL,並使用該密鑰計算簽名。客戶端Javascript處理程序將此URL傳遞給SWFUpload(upload_url屬性)。用戶選擇要上傳的文件,並且SWFUpload開始將它們發佈到upload_url。 Node.js應用程序驗證該URL未過期並且簽名有效。它使用強大的庫處理表單數據。

另一個細節。 Flash要求Node.js應用程序提供允許跨站點請求的crossdomain.xml。

我的Node.js應用程序不會觸及數據庫;但如果是這樣的話,我會按照之前的建議分享DATABASE_URL。請注意,除非擁有專用數據庫,否則不能在Heroku外部共享DATABASE_URL。共享數據庫的DATABASE_URL無法從Heroku外部訪問(與RedisToGo等其他服務不同)。

相關問題