推拉結合實現 準 實時推送

2021-10-09 02:02:20 字數 1685 閱讀 7229

rocketmq

consumer從broker的consumerqueue中拉取未消費的訊息時,採用長輪詢機制(push模式),即如果存在直接返回,如果不存在未消費的訊息,broker端會hold住此請求30s,在hold期間如果reputmessageservice往consumerqueue推送了新訊息,則釋放hold,給consumer返回資料。

因此本質上rocketmq的push模式也是一種pull,通過長輪詢達成準實時,給人一種push的感覺

apollo 3

apollo採用定時+長輪詢的機制拉取配置。客戶端不停請求configserver的配置變化通知介面,如果配置有變更,就會返回變更資訊。configserver使用了servlet 3的非同步特性,沒有配置變更時,將hold住連線30,等到有通知時立刻返回,實現乙個基於http的長連線。

同時apollo也採用了一種兜底策略,預設每5min拉取一次最新配置,來覆蓋本地的快取配置。

樂視配置中心(只支援xml)

客戶端每隔3s到配置中心拉取最新配置,通過version或md5判斷是否有變化,有則將配置解析為物件,重置快取,當物件實現了自定義的介面時,則觸發與該物件關聯的處理器,執行相關邏輯。因此配置的更改是有延時的,無法實時感知。

---------------------------

nginx應用

nginx作負載均衡: 應用下線時,通過nginx登出網域名稱,以保證流量不會打到相應的機器上。應用上線完成後(健康檢測成功),將此結點註冊到nginx上,實現負載均衡。實際工作中,發現有在健康檢測中做應用預熱的,這是很不合理的。應該在spring應用上下文refresh事件中實現預熱。

上下線基本上是實時的,上線過程中請求不可用可降低到最低(失敗的請求通過客戶端的重試機制來重試)。

dubbo服務發現和治理

以zk實現服務註冊和發現為例。當provider啟動完成時,會通知zk建立臨時結點,然後通過心跳機制,保證此provider可用(臨時結點不會被刪除)。當provider下線時,會通知zk刪除臨時結點,以說明此服務不可用。

當consumer啟動時,會從zk拉取需要的服務註冊資訊,快取到本地,同時利用zk的watcher機制來監聽provider的變化。當監聽到變化時,更新本地快取。當consumer呼叫服務中,根據本地快取中的服務註冊資訊構建呼叫請求,並根據負載均衡策略**請求。

因此,dubbo的服務發現接近準實時,上下線過程請求不可用可降低到最低(重試機制).

spring cloud

以euraka 1.x版本為例,服務提供者在啟動的時候通過傳送rest請求的方式將自己註冊到eurakasever上,同時帶上自身元資料。測試完成後每隔30s傳送一次心跳,服務端超過90s未收到心跳,則下線此服務。服務下線時,也會通知eurakasever服務下線。

服務消費者啟動的時候會傳送乙個rest請求給註冊中心,獲取已註冊的服務清單。為了效能考慮,eurakaserver會維護乙份唯讀的服務清單來返回給客戶端,這份快取清單會隔30s重新整理一次。消費者獲取清單之後,就可以獲得服務者的例項名和元資料資訊。ribbon預設使用輪詢的方式呼叫,從而實現客戶端負載均衡。

目前來看spring cloud消費端對服務的上下線感知是最差的,直觀的表現就是下上線期間會產生大量的無效請求(重試機制可以降低些損失),同時負載均衡的有效利用率最低。當拆解的微服務數量比較少時,euraka的壓力不大時,可以關閉euraka server的多級快取,同時降低consumer的拉取頻率(每3s拉取)。

結合webservice實現dwr推送

情景 客戶端需要實時提醒服務,比如某個日程已過期的提醒,並且是剛剛過期的時間 所以是實時 1.日程物件放在資料庫,由webservice呼叫得到 2.webservice在拿到資料後必須主動把資料給我的主程式端 3.主程式端在拿到資料後開始推送資料到客戶端 public class checkuns...

rsync結合 inotfiy 實現實時備份

rsync簡介 rsync是linux系統下的資料映象備份工具。使用快速增量備份工具remote sync可以遠端同步,支援本地複製,或者與其他ssh rsync主機同步 inotify簡介 inotify 是一種強大的 非同步的檔案系統事件監控機制,通過inotify可以監控檔案系統中新增 刪除,...

Winform實現後台推送,資料跨執行緒實時重新整理控制項

用委託事件實現資料實時推送並重新整理頁面,適用於前台和後台松耦合但沒有分布式部署的情況。2.首先定義乙個全域性的委託事件 csharp view plain copy public class notice 3.後台執行緒呼叫messagesend方法 csharp view plain copy ...