選主程序的方式有很多,完善點的方案就是zookeeper來做。這裡介紹的是一種基於redis選主的方案,快速開發,快速實現。
springside4裡有個masterelector類,細讀**後整理出自己的總結如下。
1. 業務程序啟動時生成hostid,hostid的規則是「主機名-隨機數」,一台主機部署多個程序例項的情況,也可以改為「主機名-埠」。
2. 業務程序呼叫jedis.get(masterkey)獲取masterfromredis。
3. 如果masterfromredis為空,呼叫setnx(masterkey, hostid)方法設值,方法返回值大於0當前程序選為主程序,並且expire(masterkey,expireseconds)設定key的有效期。setnx返回值小於等於0時不能選為主程序。
如果masterfromredis等於hostid,當前程序選為主程序,並且expire(masterkey, expireseconds)設定key的有效期。
4. 按時間間隔intervalseconds定期執行第二步和第三步。
當get(masterkey)之後獲取到的masterfromrdis為空,在setnx之前,有其他程序已經set了masterkey的值,本程序再呼叫setnx返回0失敗.reids api文件有詳細介紹:
setnx key value
將 key 的值設為 value ,當且僅當 key 不存在。
若給定的 key 已經存在,則 setnx 不做任何動作。
setnx 是『set if not exists』(如果不存在,則 set)的簡寫。
可用版本:
>= 1.0.0
時間複雜度:
o(1)
返回值:
設定成功,返回 1 。
設定失敗,返回 0 。
intervalseconds定時時間間隔設定短些,可以減少異常情況下沒有主的情況。
附上springside4的**
public class masterelector implementsrunnable .", hostid);
* 停止分發任務,如果是自行建立的threadpool則自行銷毀。
publicvoid stop() catch (unknownhostexception e) ", masterfromredis);
//if master is null, the cluster just start or the master had crashed, try toregister myself
//as master
if(masterfromredis == null) .", hostid);
return;
}else {
master.set(false);
return;
//if master is myself, update the expire time.
if(hostid.equals(masterfromredis)) {
jedis.expire(masterkey,expireseconds);
master.set(true);
return;
master.set(false);
* 如果應用中有多種master,設定唯一的mastername
publicvoid setmasterkey(string masterkey) {
this.masterkey= masterkey;
//for test
publicvoid sethostid(string hostid) {
this.hostid= hostid;
主程序和渲染程序
chromium每個tab都是乙個程序 主程序 main process 可以使用和系統對接的api,建立選單,上傳檔案等等 建立渲染程序 全面支援node.js 只有乙個,作為整個程式的入口點 渲染程序 main process 可以有多個,每個對應乙個視窗 每個都是單獨的程序 全面支援node....
electron主程序通訊渲染程序
可以先去看看之前的 主程序即electron的main.js。渲染程序即browserwindow物件新建的。定義乙個js檔案這裡就叫renderer吧,在全域性定義乙個electron物件用來進行與html進行訂閱事件通訊。global.electron require electron 在bro...
宿主程序的介紹
宿主程序是 visual studio 2005 中的一項功能,能提高除錯效能,支援部分信任除錯並支援設計時表示式計算。宿主程序檔案的檔名中包含 vshost,並位於專案的輸出資料夾中。有關更多資訊,請參見除錯和宿主程序。說明 宿主程序檔案 vshost.exe 由 visual studio 20...