鍍金池/ 問(wèn)答/Java  Android/ 多個(gè)微服務(wù)做定時(shí)任務(wù),如何做負(fù)載均衡

多個(gè)微服務(wù)做定時(shí)任務(wù),如何做負(fù)載均衡

部署多個(gè)微服務(wù),業(yè)務(wù)邏輯都是一樣的,就是做定時(shí)任務(wù)。在spring cloud中如何均勻的讓每個(gè)微服務(wù)都做定時(shí)任務(wù),互相不沖突

回答
編輯回答
懶豬
  1. 發(fā)延遲消息

  2. 設(shè)置互斥鎖,例如給 redis 設(shè)置一個(gè) nx 的 key

  3. 采用 zookeeper 的選舉機(jī)制做定時(shí)任務(wù),springcloud 的話 eureka 應(yīng)該也會(huì)有類似的機(jī)制吧

2017年11月8日 22:09
編輯回答
編輯回答
櫻花霓

一個(gè)辦法就是用任務(wù)隊(duì)列,將任務(wù)發(fā)布到隊(duì)列里,然后讓空閑的微服務(wù)自動(dòng)去領(lǐng)取。這樣就不會(huì)有沖突了。

2018年5月7日 21:25
編輯回答
若相惜

不復(fù)雜的情況,可以使用數(shù)據(jù)庫(kù)來(lái)簡(jiǎn)單實(shí)現(xiàn)。
像mysql有內(nèi)置的程序鎖函數(shù):
get_lock() // 獲取鎖
release_lock() // 釋放鎖

具體的函數(shù)使用可以查看mysql的函數(shù)介紹
使用這種方式來(lái)控制分布式任務(wù)切換有個(gè)注意事項(xiàng),這個(gè)鎖的獲取和釋放是和數(shù)據(jù)庫(kù)連接相關(guān),一個(gè)連接創(chuàng)建的鎖只能這個(gè)連接自己釋放,這就需要在數(shù)據(jù)庫(kù)連接池做改動(dòng),不過(guò)最簡(jiǎn)單還是直接原生jdbc獲取數(shù)據(jù)庫(kù)連接,不使用連接池來(lái)獲取連接,拿到鎖,執(zhí)行該微服務(wù)的任務(wù),任務(wù)完成后使用該連接釋放鎖。做小數(shù)量分布式任務(wù)切換沒(méi)問(wèn)題,大數(shù)量就得考慮復(fù)雜的切換框架了……

2018年7月28日 00:30
編輯回答
拼未來(lái)

是負(fù)載均衡的每個(gè)節(jié)點(diǎn)都要運(yùn)行定時(shí)任務(wù),還是要確保有且只有一個(gè)節(jié)點(diǎn)執(zhí)行任務(wù)?
如果是前者的話,直接VM里單起一條線程就OK了啊

2018年2月12日 22:24