這一節我將向大家介紹一下YayCrawler的運行機制,首先允許我上一張圖:
首先各個組件的啟動順序建議是Master、Worker、Admin,其實不按這個順序也沒關系,我們為了講解方便假定是這個啟動順序。
一、Master端分析
Master啟動后會連接Redis查詢任務隊列狀態,Master維持了四個狀態的任務隊列:待執行任務隊列、執行中任務隊列、成功任務隊列和失敗任務隊列。Master內部有一個任務調度器,Master等Worker心跳包到來的時候,觀察Worker是否還有任務分配的余地(每個Worker可以設置自己本地的任務隊列的長度),如果Worker還能接收n個任務,任務調度器就會從待執行任務隊列中取至多n個任務分配給該Worker。分配成功后,Master會把這n個任務從待執行隊列移到執行中隊列。
Master會定期掃描已注冊的Worker,如果某個Worker的上次心跳時間距離了現在已經超過了2倍Worker自身的心跳間隔,那么Master會認為此Worker已經失聯,不能再給它分配任務,因此會把它從已注冊列表移除。
Master會定期掃描執行中隊列,如果發現某個任務的分配時間距離現在已經超過了某個預設值,我們可以認為這個任務出現了差錯,應該重新執行一遍,因此Master會重新把這個任務從執行中隊列移到待執行隊列,以便再次分配執行。
二、Worker端分析
Worker的配置文件里面配置了Master的服務通信地址,Worker啟動的時候就會通過這個地址向Master注冊,注冊的信息包括Worker的通信地址、心跳間隔、任務配額等。Worker注冊成功后會定期向Master發送心跳,向Master匯報自己的狀態的同時領取任務。
三、Admin端分析
Admin端主要是為用戶提供一個操作的接口界面,這是一個Web工程,Admin端的配置文件里面也記錄了Master的服務通信地址。用戶在Admin端可以針對目標網頁編寫抽取規則,測試規則,直到保存到數據庫。用戶可以在界面上查看任務的執行情況,比如成功的任務,失敗的任務,任務的結果等;用戶也可以在界面上單個或批量發布普通任務/定時任務,這些任務最終會在Worker上執行,Worker在解析的時候會參考用戶設置的解析規則。
四、其他
Master、Worker和Admin三者之間的通信是基於http協議的,為了安全,通信過程中都使用了token, timestamp, nonce來對消息體進行簽名並驗證,只有簽名正確才能通信成功。
框架中的隊列、持久化方式都是基於接口編程的,您可以很方便的用自己的實現來替換原有的處理。