分布式系統中的非同步IO與執行緒池

2021-05-26 15:14:18 字數 1258 閱讀 8266

分布式搜尋系統中,一般都有merge和search兩種角色,分別部署在不同的機器上。由於資料量巨大,每台search只能載入部分索引資料,多台search機器合在一起組成全量索引。乙個查詢為了獲得正確結果,需要把這個查詢發給所有的search機器,經過檢索後,再把所有search機器的結果聚合在一起,產生最終的正確結果;這個分發再聚合的過程,就是由merge來實現的。

可以簡單的認為,merge對外置收使用者請求,對內分發到所有機器,等待search返回結果,聚合排序然後返回給使用者。可以看到merge和多台search之間,保持長連線是必要的。假設merge同時接收到兩條請求,有兩種簡單做法做分發:1, 使用乙個長連線,序列做; 2, 在merge和每台search間建立兩個長連線,並行做。首先1是不靠譜的,因為search一般都是多執行緒的,序列就完全利用不到這個特性;方案2,最開始我們有套系統是這麼做的,merge和每台search之間保持的長連線數量跟search的執行緒數有關。由於集群規模越來越大,長連線數量也成比例增長,給集群帶來很大壓力。

有一種改進方式,同時可以有多個查詢串在乙個長連線上並行。大致實現是,merge和search之間每個長連線connection都包含乙個channelpool物件,這個物件可以理解為map,包含了channelid和query的對映。merge分發請求時,封裝乙個自己的資料報,包頭含有channelid,search檢索結束返回結果時,同時把這個channelid也送回來。merge通過這個channelid和這個鏈結的channelmap,就知道是哪個query的查詢結果了。通過這種方式,乙個長連線上,可以同時由多個查詢並行進行,降低了大集群的鏈結壓力。

search端從乙個長連線中陸續讀出檢索請求,多個檢索請求在search內部由執行緒池處理,處理完後再通過接收到這個請求的長連線,寫出去(包含channelid)。merge端的該鏈結收到search響應後,通過channelpool獲得這個請求的物件,把結果寫到該物件中。收集到所有search的返回結果後,該請求就可以進行下一步操作,比如合併,排序,返回給使用者等。

22 public:

23     virtual void run() = 0;

24 };

2526 class threadpool ;

3435     // 阻塞的新增和刪除任務 使用訊號量做資訊通知

36     void enqueuetask(runnable *job);

37     runnable* dequetask();

3839     void start()

51     };

52 };

分布式系統中的分布式事務

分布式事務中可以借助mq訊息系統來進行事務控制,這一點與可靠訊息最終一致方案一樣。看來mq中介軟體確實在乙個分布式系統架構中,扮演者重要的角色。最大努力通知方案是比較簡單的分布式事務方案,它本質上就是通過定期校對,實現資料一致性。中介軟體如何保證訊息的一致性 問題的問法多種多樣,怎麼保證兩個伺服器的...

分布式與非同步請求(ajax)

首先介紹一下非同步請求方式 ajax 今天學到的內容 ajax教程 在.jsp檔案或.html檔案中使用script標籤運用ajax技術進行網頁的動態更新,1.get 負責查詢 返回資料任意 人工解析 2.post 表單資料提交等 返回值型別任意 人工解析 3.getjson 查詢獲取json資料 ...

分布式與非同步請求(ajax)

首先介紹一下非同步請求方式 ajax 今天學到的內容 ajax教程 在.jsp檔案或.html檔案中使用script標籤運用ajax技術進行網頁的動態更新,1.get 負責查詢 返回資料任意 人工解析 2.post 表單資料提交等 返回值型別任意 人工解析 3.getjson 查詢獲取json資料 ...