ENode是一個.NET平臺下,純C#開發(fā)的,基于DDD,CQRS,ES,EDA,In-Memory架構風格的,可以幫助開發(fā)者開發(fā)高并發(fā)、高吞吐、可伸縮、可擴展的應用程序的一個應用開發(fā)框架。
1. 一個DDD開發(fā)框架,完美支持基于六邊形架構思想的開發(fā)
2. 實現(xiàn)CQRS架構思想,并且框架提供C端命令的處理結果的返回,支持同步返回和異步返回
3. 內(nèi)置Event Sourcing(ES)架構模式,讓C端的數(shù)據(jù)持久化變得通用化
4. 聚合根常駐內(nèi)存,in-memory domain model
5. 聚合根的處理基于Command Mailbox, Event Mailbox的思想,類似Actor Model, Actor Mailbox
6. 嚴格遵守聚合內(nèi)強一致性、聚合之間最終一致性的原則
7. Group Commit Domain event
8. 基于聚合根ID+事件版本號的唯一索引,實現(xiàn)聚合根的樂觀并發(fā)控制
9. 框架保證Command的冪等處理
10. 通過聚合根ID對命令或事件進行路由,做到最小的并發(fā)沖突、最大的并行處理
11. 消息發(fā)送和接收基于分布式消息隊列EQueue,支持分布式部署
12. 基于事件驅動架構范式(EDA,Event-Driven Architecture)
13. 基于隊列的動態(tài)擴容/縮容
14. EventDB中因為存放的都是不可變的事件,所以水平擴展非常容易,框架可內(nèi)置支持
15. 支持Process Manager(Saga),以支持一個用戶操作跨多個聚合根的業(yè)務場景,如訂單處理,從而避免分布式事務的使用
16. ENode實現(xiàn)了CQRS架構面臨的大部分技術問題,讓開發(fā)者可以專注于業(yè)務邏輯和業(yè)務流程的開發(fā),而無需關心純技術問題
晚上把公司應用的架構結合之前研究的東西梳理了下,整理了一張架構規(guī)劃圖,貼在這里備份
下面是個人理解的做架構的幾個要點:
1、系統(tǒng)安全
這是首要考慮的,以這張圖為例,網(wǎng)絡劃分為3個區(qū):
a) DMZ區(qū)可以直接公網(wǎng)訪問,也可以 與App Core區(qū)互通,但不能直接與DB Core區(qū)互通 (通常這里放置 反向代理Web服務器)
b) App Core區(qū)能與DMZ區(qū)、DB Core區(qū)互通,但是無法直接從公網(wǎng)訪問 (通常這里放置 應用服務器、中間件服務器之類)
c) DB Core區(qū)僅與App Core區(qū)互通 (通常這里放置 核心數(shù)據(jù)庫)
2、盡量消除單點故障
上圖中,除了“硬件負載均衡”節(jié)點外,其它節(jié)點都可以部署成集群(DB有點特殊,傳統(tǒng)RDBMS要實現(xiàn)分布式/集群還是比較困難的,要看具體采用的數(shù)據(jù)庫產(chǎn)品,并非所有數(shù)據(jù)庫都能方便的做Sharding),Jboss本身可以通過Domain模式+mod_cluster實現(xiàn)集群、Redis通過Master/Slave以Sentinel方式可以實現(xiàn)HA、IBM MQ本身就支持集群、FTP Server配合底層儲存陣列也可以做到HA、Nginx靜態(tài)資源服務器自不必說
3、成本
盡量采用開源成熟產(chǎn)品,jboss、redis、nginx、apache、mysql、rabbit MQ都是很好的選擇。硬件負載均衡通常成本不低,但是效果明顯,如果實在沒錢,域名解析采用DNS輪詢策略,也能達到類似效果,只不過可靠性略差。
4、Database問題
常規(guī)企業(yè)應用中,傳統(tǒng)關系型數(shù)據(jù)仍然是主流,但是no-sql經(jīng)過這幾年發(fā)展,技術也日漸成熟了,一些非關鍵數(shù)據(jù)可以適當采用no-sql數(shù)據(jù)庫,比如:系統(tǒng)日志、報文歷史記錄這類相對比較獨立,而且增長迅速的數(shù)據(jù),可以考慮存儲到no-sql db甚至HDFS、TFS等分布式開源文件系統(tǒng)中。
如果系統(tǒng)數(shù)據(jù)量級達到單機RDBMS的上限,盡早考慮Sharding方案,目前mysql在這方面比較成熟,其它數(shù)據(jù)庫就不好說了。
5、性能
web server、app server這些一般都可以通過集群實現(xiàn)橫向擴張,滿足性能日常增長的需求。最大的障礙還是DB,如果規(guī)模真達到了DB的上限,還是考慮換分布式DB或者遷移到“云”上吧。