我在單一虛擬機器上運行多個客戶端電子商務 Web 應用程序,每個 Web 應用程式都是一個 Node.js Express 應用程式。
Express Web 應用程式透過 API 與後端通信,以檢索頁面內容和產品清單等。洛基斯)對於所有發生的搜索,這對我們來說效果很好,因為每個客戶端的平均產品目錄只有大約 80 個項目,我們在每個客戶端 Web 應用程序中運行一個簡單的 cron 來刷新內存數據庫通過API 呼叫以取得最新的產品清單。
這樣做的一些缺點是,由於我們使用 PM2 在 2 節點集群中運行每個應用程序,因此必須複製內存數據庫,因為您無法在節點之間共享內存,以確保內存數據庫保留在同步我們使用IPC將消息傳遞到集群內的所有進程。
當我們為更大的客戶帶來更大的產品目錄時,我們真的不想為每個子進程保留重複的記憶體資料庫。
我們提供的服務的工作方式是,儘管每個客戶的產品目錄並不大,但搜尋量卻相當大,因此擁有 80 個商品的客戶每天仍可能獲得 1000 次搜尋。
我心裡有幾個選擇,但不確定哪個是最好的:
選項 1 - 單一全域 Elasticsearch 集群
我已經討論過並考慮過使用elasticsearch,然後將每個客戶端Web應用程式指向單一全域elasticsearch叢集來執行產品搜索,這樣我們就可以使用事件來使elasticsearch資料庫即時保持最新。
但是,我不知道隨著我們規模的擴大,這將如何表現,我不希望 Elasticsearch 成為瓶頸
選項 2 - 本地 nosql 資料庫
第二個選項是簡單地替換使用 lokijs 作為記憶體資料庫,並為每個 VM 共用一個 nosql 資料庫(例如 mongo),然後所有 Web 應用程式都使用本機資料庫進行查詢,每個 Web 應用程式仍然負責用於更新自己商店的產品目錄。然後,當我們添加更多虛擬機器時,每個虛擬機器都將擁有自己的本機資料庫,供運行在其中的任何應用程式使用
我們是分面搜尋和分面聚合的大量用戶,以獲取分面的計數