2017-08-29 44 views
1

我已經編寫了一個應用程序node.js,該應用程序從用戶處獲得輸入並基於少量模板生成pdf文件。如何以異步方式使用pdfkit npm

我爲此使用了pdfkit npm。我的應用程序正在生產中運行。但是我的應用程序是非常緩慢的,下面是原因:

我面臨什麼問題:

  • 它是同步的方式進行工作。我可以通過給出一個例子來解釋它 - 假設一個請求來到應用程序生成一個pdf,正在開始處理,處理後它返回生成的PDF url的響應。但是,如果多個請求到達服務器,它會逐個處理每個請求(以同步的方式)。
  • 隊列中的所有請求必須等待,直到前一個請求完成。
  • 我的應用程序給出的最大時間超時內部服務器錯誤

我無法更改庫,爲什麼?

  • 我已經在js中爲pdfkit編寫了40個模板。每個模板都是1000 - 3000行。
  • 如果我將更改庫,我必須根據新庫重寫這些模板。
  • 需要好幾個月才能正確地重寫和測試它。

我現在使用的是哪種解決方案:

  • 我現在管理一個隊列,只要有請求來它得到了排隊和令人滿意的消息在響應用戶送回去。

爲什麼這種解決方案不可行?

  • 用戶在成功申請時應提供有效的pdf網址。但是在隊列方式中,用戶只能得到確認消息。而PDF正在稍後處理隊列中。

我現在正在尋求什麼樣的解決方案?

  • 任何方式,通過它我可以把這個應用程序的多線程/異步的,因此,這將是能夠處理上的時間多的要求,而不會阻塞的資源?

請救我一命。

回答

0

我討厭把它分解給你,但是在按順序執行任務時進行計算是節點的一個非常基本的部分。這聽起來像加載這些模板是一個CPU綁定的任務,並且由於Node是單線程的,它會按照它們進來的順序將它們從隊列中取出。

另一方面,任何框架都會有類似的問題。節點是單線程意味着它實際上非常高效,因爲它不會損失上下文切換的週期。

您的程序一次可以處理多少個PDF代?你在運行什麼類型的硬件?如果一秒鐘的請求失敗,那麼可能是一個編程修復。

對於節點,可以使異步越多越好。例如,任何時候你正在閱讀一個文件,它應該是異步的。

您可以發佈您的PDF創建請求函數的代碼嗎?