Eventuate:基於操作CRDT的服務框架
Eventuate有Java和Scala兩個API,基於Akka編寫。
具體特性如下:
1.提供建立有態事件溯源服務、持久化和記憶體查詢資料庫和事件處理管道。
2.啟用服務透過一個可靠分割槽冗餘事件匯流排通訊,該匯流排基於因果事件順序,可分佈到大型分散式系統。
3.支援使用因果一致性進行有態服務複製,使用自動和互動的衝突解決方案實現當前狀態更新。
4.提供基於操作的CRDTs(Conflict-free replicated data types )實現。
5.允許服務跨多個區域分佈開發執行
6.支援用於更新查詢資料庫的分散式服務的事件聚合
7.提供適配第三方流處理框架用於事件流分析。
基於操作的CRDTs
CRDTs是免衝突複製資料型別Conflict-free replicated data types 的簡稱。是一種可複製的資料型別,在發生更新時,所有資料型別最終會收斂到相同狀態。一個CRDT在更新時無需進行復制協調,因此節約了協調成本,提高效率。這使得CRDT對於寫操作高可用,CRDT能夠被分類成基於狀態的CRDTs和基於操作的CRDTs,簡稱CvRDTs和CmRDTs。基於狀態的CRDTs是於傳播狀態的複製,而基於操作的CRDTs則是傳播操作。
如果操作是透過一個可靠的因果(RCB)中介軟體廣播傳播就會保證Cmrdt複製最終一致收斂,他們設計用於並行操作交換。
CvRDTs不需要對底層訊息中介軟體有特別要求,但是狀態傳播需要增加頻寬或降低狀態大小。
CmRDT操作分為兩個階段:prepare和effect,prepare在本地節點上執行。它著眼於操作和(可選)當前狀態,併產生一個代表操作的訊息,然後分發給所有的其他節點。effect適用於所有節點上的傳播操作。
與事件溯源有關
CmRDT兩個更新階段:prepare和effect和事件溯源實體的更新階段(命令處理和事件處理)有關:
1.在命令處理中,傳入命令(可選)對實體的當前狀態進行了驗證,如果驗證成功,則表示代表該命令效果的事件可被寫入事件日誌中。這相當於在cmrdt的prepare階段產生的操作。
2.在事件處理中,寫入事件日誌中的寫入事件被拿出使用,用於更新實體的當前狀態。這相當於將產生cmrdt的effect效果。
Eventuate提供 EventsourcedActor實現定製命令和事件處理。
可靠的因果廣播
大多數CmRDT需要更新操作的因果傳輸順序,因果傳輸可透過事件日誌提供的前後順序輕鬆完成,但是,如果事件日誌本身被複制(例如在Kafka叢集中的一個分割槽topic),或它一點也不復制的,這樣的事件日誌的可用性是有限的,因為它必須協調所有複製備份的更新。
因此,讓cmrdts共享一個完全有序的事件日誌會受限制於底層的事件日誌的可用性,這不是我們想要的。
我們需要的是將cmrdt複製跨分佈地理位置(或可用性區域)分佈,每個本地都有其自己的本地事件日誌,仍然保持可以寫入,即使與其他地方分割槽分開來。在一個本地寫入的事件透過非同步和可靠地複製到其他位置。能夠在這樣一個網路複製本地事件日誌以達到最強的全域性秩序才滿足的cmrdts規定的因果關係。
在Eventuate 中本地事件日誌稱為可複製的event log,可複製的event lg中因果跟蹤透過向量時鐘實現,向量時鐘是作為潛在的因果關係代表,是一種部分順序。
CRDT服務框架
之前介紹瞭如何將CmRDT繼承到Eventuate的事件溯源和事件協調底層設施,為了解放CmRDT開發者,Eventuate提供CmRDT服務開發框架隱藏了這些底層細節。
詳細原理見:https://krasserm.github.io/2016/10/19/operation-based-crdt-framework/
Eventuate專案:
相關文章
- 基於微服務框架Micronaut和Eventuate Tram實現分散式事務的開源案例微服務框架分散式
- 基於 xorm 的服務端框架 XGoServerORM服務端框架GoServer
- 使用Prometheus監控Golang服務-基於YoyoGo框架PrometheusGolang框架
- 基於.NET CORE微服務框架 -Api閘道器服務管理微服務框架API
- 淺談NUXT – 基於vue.js的服務端渲染框架UXVue.js服務端框架
- 基於graphql的微服務基礎框架微服務框架
- 基於 Nuxt.js 服務渲染框架的後臺管理系統UXJS框架
- 基於.NET CORE微服務框架 -談談surging的服務容錯降級微服務框架
- go基於grpc構建微服務框架-服務註冊與發現GoRPC微服務框架
- 基於Nginx搭建WebDAV服務NginxWeb
- 構建基於RocketMQ的分散式事務服務MQ分散式
- 基於代理服務的介面合併方案
- React 服務端渲染框架 Next.js 基於 Gank api 實戰React服務端框架JSAPI
- 基於ECS搭建GitLab服務Gitlab
- 服務型框架框架
- 分散式事務:基於可靠訊息服務分散式
- Go實現基於WebSocket的彈幕服務GoWeb
- 基於 swoole 的 websocket 服務一:狀態同步Web
- 基於Zookeeper執行獨立的Lagom服務Go
- 服務端指南 | 基於角色的訪問控制服務端
- 基於Codeigniter的個推 PUSH 服務
- 基於lua協程的AI服務實現AI
- Peritext:用於富文字協作的新型CRDT
- 基於 Swoole 搭建 WebSocket 服務詳解Web
- 基於Docker部署Dubbo+Nacos服務Docker
- 基於lbs服務應用開發
- 基於畢昇上線基於大模型對應服務大模型
- 基於Spring Cloud微服務叢集的服務治理思考SpringCloud微服務
- 服務管理框架的嘗試框架
- 基於Laravel框架定時任務相關實現方法及操作注意事項Laravel框架
- 服務端指南 | 基於資料的訪問控制服務端
- 記一次基於Cloudflare服務的爬蟲Cloud爬蟲
- 基於gin的golang web開發:服務間呼叫GolangWeb
- 基於 swoole 的 websocket 服務實現狀態同步Web
- 基於EF Core儲存的國際化服務
- 如何基於gRPC溝通微服務框架RPC微服務框架
- 微服務架構 | 5.2 基於 Sentinel 的服務限流及熔斷微服務架構
- React服務端渲染實現(基於Dva)React服務端