eventbus 是一種事件發布訂閱模式,通過 eventbus 我們可以很方便的實現解耦,將事件的發起和事件的處理的很好的分隔開來,很好的實現解耦。 微軟官方的示例專案 eshoponcontainers 也有在使用 eventbus 。
這裡的 eventbus 實現也是參考借鑑了微軟 eshoponcontainers 專案。
eventbus 處理流程:
微服務間使用 eventbus 實現系統間解耦:
借助 eventbus 我們可以很好的實現元件之間,服務之間,系統之間的解耦以及相互通訊的問題。
起初覺得 eventbus 和 mq 其實差不多嘛,都是通過非同步處理來實現解耦合,高效能。後來看到了下面這張圖才算明白為什麼要用 eventbus 以及 eventbus 和 mq 之間的關係,eventbus 是抽象的,可以用mq來實現 eventbus.
解耦合(輕鬆的實現系統間解耦)
高效能可擴充套件(每乙個事件都是簡單獨立且不可更改的物件,只需要儲存新增的事件,不涉及其他的變更刪除操作)
系統審計(每乙個事件都是不可變更的,每乙個事件都是可追溯的)
來看乙個使用示例,完整**示例:
internal class eventtest
); eventbus.unsubscribe();
eventbus.unsubscribe>();
eventbus.publish(new counterevent );
}}internal class counterevent : eventbase
}internal class countereventhandler1 : ieventhandler, handler type:");
return task.completedtask;
}}internal class countereventhandler2 : ieventhandler, handler type:");
return task.completedtask;}}
eventstoreinmemory 實現:
eventstoreinmemory 是ieventstore
將資料放在記憶體中的實現,使用了 concurrentdictionary 以及 hashset 來盡可能的保證高效,具體實現**如下:
public class eventstoreinmemory : ieventstore
else);}
}public bool clear()
public icollectiongeteventhandlertypes() where tevent : ieventbase
return new type[0];
}public string geteventkey()
public bool hassubscriptionsforevent() where tevent : ieventbase
public bool removesubscription()
where tevent : ieventbase
where teventhandler : ieventhandler
return false;}}
eventbus 的實現,從上面可以看到 eventstore 儲存的是ieventhandler
對應的 type,在 publish 的時候根據 type 從 ioc 容器中取得相應的 handler 即可,如果沒有在 ioc 容器中找到對應的型別,則會嘗試建立乙個型別例項,然後呼叫ieventhandler
的handle
方法,**如下:
/// /// eventbus in process
///
public class eventbus : ieventbus
public bool publish(tevent @event) where tevent : ieventbase
var handlers = _eventstore.geteventhandlertypes();
if (handlers.count > 0)
}catch (exception ex)
] error, eventhandlertype:");}}
handlertasks.whenall().configureawait(false);
return true;
}return false;
}public bool subscribe()
where tevent : ieventbase
where teventhandler : ieventhandler
public bool unsubscribe()
where tevent : ieventbase
where teventhandler : ieventhandler
}
來看乙個實際的專案中的使用,在我的活動室預約專案中有乙個公告的模組,訪問公告詳情頁面,這個公告的訪問次數加1,把這個訪問次數加1改成了用 eventbus 來實現,實際專案**:
定義 event 以及 eventhandler
public class noticeviewevent : eventbase
// userid
// ip
// ...
}public class noticevieweventhandler : ieventhandler);}}
這裡的 event 只定義了乙個 noticeid ,其實也可以把請求資訊如ip/ua等資訊加進去,在 eventhandler裡處理以便日後資料分析。
註冊 eventbus 相關服務以及 eventhandlers
services.addsingleton();
services.addsingleton();
//register eventhandlers
services.addsingleton();
訂閱事件
發布事件
eventbus.publish(new noticeviewevent );
自己動手實現乙個簡單的React
為了更好的理解react,我決定讀preact的原始碼,preact是乙個非常小的框架,同時也和react的實現原理以及api一樣,幾乎可以很好代替react。雖然還是有一些差異的。但是使用的時候幾乎不會有什麼違和感。看原始碼總是不夠過癮,於是做了乙個偉大的決定就是自己親手去寫乙個react,畢竟p...
動手實現乙個簡單神經網路
import numpy as np 定義乙個啟用函式 defsigmoid x,deriv false if deriv true return x 1 x return 1 1 np.exp x 構造樣本 x np.array 1,0,1,0,1,1 1,1,1,0,1,1 1,0,1,0,0,...
自己動手實現乙個簡單的string類 一
定義乙個基本的 string 類 class string private char base long int length 我們可以看到在這個類裡面我們用乙個char型指標來儲存字串值,long int 型值length來儲存字串的長度。由於我們知道string類支援這樣的建構函式 string...