簡體   English   中英

微服務架構任務系統問題

[英]Microservices architecture tasks system problem

此刻,我正在編寫具有微服務架構的新應用程序。 我的應用程序將做什么的簡短說明如下:

  • 微服務 A 將抓取多個電子商務產品頁面,並將所有抓取的產品一一發送到我的下一個微服務,從現在開始我將其稱為 B。 對於每個沒有running: true任務的產品,它會抓取產品並創建一個帶running: true的新任務。
  • 微服務 B 將處理它接收到的每個產品(更新我數據庫中的數據),並將與數據庫相比的所有更改數據發送到我的下一個微服務,從現在開始我將其稱為 C。
  • 微服務 C 收到更改的產品並向我的 discord & slack 頻道發送消息。 完成后,它將將此產品的運行任務設置為running: false

我目前正在苦苦掙扎的是,我希望微服務 A 重新開始對微服務 C 處理過的產品進行抓取。為此,我想到了某種任務系統,其中每個抓取的產品也有一個任務 ID與他們聯系在一起。 我目前遇到的唯一問題是:

  • 任務可能會凍結/失敗或其他什么。 為了解決這個問題,我有一些仍在運行的任務(數據庫中的變量)並且在 5 分鍾前開始自動停止。 這在我看來並不理想,因為這意味着一項任務可能需要 5 分鍾才能完成。
  • 由於每個被抓取的產品都分配了 1 個任務,因此我必須快速部署大量微服務 B 才能正確處理所有負載。

我想問的是,如果有人有關於如何在我的微服務中改進/實現這樣一個系統的方法或技巧。 每個產品都需要在前一個產品完成后立即刮掉。 目前微服務 A 只是檢查它是否可以使用 setInterval 找到產品的正在運行的任務。

所有這些都是在 NodeJS 中開發的,所有信息都保存在 MongoDB 數據庫中。 微服務之間的通信是通過rabbitMQ完成的。

很感謝任何形式的幫助。

我想為這個架構添加兩點。 似乎每個微服務都會隨着時間改變數據的狀態,但數據源是相同的。

1. 為什么不在每個微服務[state]處改變數據狀態?

現在,您正在為您開始running:true一項作業使用布爾值running:true 我們可以將其更改為['scrapping', 'compare', 'notify']

{
    ...
    status : 'scrapping',
    jobId : 23,
    ...
}

現在,當數據最后是微服務 C 時,它可以為消費者微服務 A 發布一個狀態為“通知”的新作業,A 可以有條件地處理這種情況,並在需要時進行回收。 另一個好處是每個微服務也可以有條件地識別基於作業狀態的作業。 因此,在任何失敗或重啟的情況下,每個微服務只會執行符合其標准的任務。 例如,微服務 B 不會啟動一個沒有scrapping狀態的工作。 基本上,只有在使用channel.ack(message)完成后才確認您的工作。

2.數據同步

我不建議創建多個 B 微服務作為消費者,數據同步可能存在問題[而多個消費者 B,在同一頁面上使用不同的產品] 或者,您可以測量每頁的產品列表,相應地調整您的隊列配置進行一些測試(但不要排隊太長,因為這會降低速度並影響性能,或者將它們捆綁為一項作業並將其發送進行處理。

探索更多:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM