Giter Site home page Giter Site logo

tangxuehua / enode Goto Github PK

View Code? Open in Web Editor NEW
1.8K 1.8K 565.0 5.58 MB

ENode is a framework aims to help us developing ddd, cqrs, eda, and event sourcing style applications.

Home Page: http://www.cnblogs.com/netfocus/category/496012.html

License: MIT License

C# 99.72% TSQL 0.28%

enode's People

Contributors

jaohaohsuan avatar rocleegithub avatar tangxuehua avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

enode's Issues

enode aggregate and domain event refactory.

  1. ICommandService调整,只保留Send方法,且不提供回调函数;去掉了Execute方法;
  2. 设计了一个IAggregateRoot接口,domain model以后只需要依赖于该接口即可,当然,为了方便用户使用,框架还是提供了一个默认的AggregateRoot实现基类;
  3. 将IEvent重命名为IDomainEvent, 新增一个ISourcableEvent接口,实现该接口的类表示会参与Event Sourcing;
  4. IAggregateRootFactory的默认实现类的实现调整,优化了性能,且不需要聚合根提供无参的构造函数了;
  5. 聚合根不需要实现IEventHandler接口了,而是采用基于约定的方式,提供一个私有的Handle方法,用来处理领域事件,修改聚合根的状态;
  6. 现在默认的实现的聚合根基类不需要用户传入聚合根的ID了,而是在聚合根创建的那个领域事件的Handle方法中为聚合根的ID赋值;
  7. 去掉command的回调函数后,如何知道command的处理结果,答案是聚合根的一切处理结果通过领域事件反映出来;所以,领域事件分两类:1)会引起聚合根状态变化的事件;2)不会引起聚合根状态变化的事件,这类事件仅仅只是通知外部聚合内做了什么验证然后验证的结果信息等;
  8. snapshot创建和还原修改了默认实现,现在是基于直接对聚合根进行序列化了,之前是先转换为一个dto,再对dto做序列化和反序列化;

完善设计,降低并发的可能性

目前的设计,当enode处理command的机器扩容时,可能会导致并发冲突。所以解决思路是:每台机器处理每个聚合根的命令时,内存中判断一下该命令是否应该由这台机器处理。判断的依据是当前聚合根的ID的hashcode % 机器数。机器数哪里来?通过equeue获取。如何知道当前机器在这些机器中排第几?也是通过EQueue获取。当然,enode不能直接耦合equeue,但可以让equeue把信息设置给enode。

enode设计优化

1.支持非修改聚合根的cmd,这种cmd的handler目的是与外部系统交互;
2.支持非聚合根产生的event,这种event比如表示某个外部系统的接口完成了;

change event persistence synchronizer api

changed to:
[Component(LifeStyle.Singleton)]
public class UserNameUniqueValidator :
IEventPersistenceSynchronizer,
IEventPersistenceSynchronizer
{
public void OnBeforePersisting(UserRegistered evnt)
{
//do some unique validation logic.
}
public void OnAfterPersisted(UserRegistered evnt)
{
//do some status change logic.
}

    public void OnBeforePersisting(UserNameChanged evnt)
    {
        //do some unique validation logic.
    }
    public void OnAfterPersisted(UserNameChanged evnt)
    {
        //do some status change logic.
    }
}

Provide a new api for ICommandContext

Currently, the ICommandContext only provide a method Get(id) which if the aggregate not exist, then the AggregateRootNotFoundException will raised;
But sometimes, we do not hope to throw the exception, we just want to return null.
So we provide a new api for ICommandContext: GetOrDefault which will not throw exception when the aggregate root not exist.

ENode未来要支持的大的功能点整理

1.ENode支持MySQL;
2.ENode提供Web监控平台;
3.ENode的事件存储水平扩展:支持分库分表,解决大量事件的存储问题;
4.ENode支持MongoDB来持久化事件;
5.ENode针对Event Handler的内置幂支持等允许开发者配置是否需要,可提高Q端的性能;
6.ENode官网、社区建立;
7.ENode跨平台;

Define a domain exception.

Only the command handler throws domain exception than we do not need to retry the command, otherwise framework should auto retry the exception.

支持json序列化

支持json序列化的方式来传递command,event以及command,event的持久化。考虑用fastjson

RegisterAllDefaultFrameworkComponents move to a seperate public method.

public Configuration UseTinyObjectContainer()
{
ObjectContainer.SetCurrentContainer(new TinyObjectContainer());
RegisterAllDefaultFrameworkComponents();
return this;
}
changed to:
public Configuration UseTinyObjectContainer()
{
ObjectContainer.SetCurrentContainer(new TinyObjectContainer());
return this;
}
public Configuration RegisterAllDefaultFrameworkComponents()
{
RegisterAllDefaultFrameworkComponents();
return this;
}

consider to support always get the lastest aggregate from command context

if cmd1 want to load agg2 to get some info which used to update agg1, in this case, agg2 will be cached in local memory for ever, and never will be changed again. That means agg2's state is always old. But developer hope every time he load agg2 can get the latest state of agg2.
That's the issue.

improve message processor initialize logic.

Rafact the code to:
for (var index = 0; index < messageExecutorCount; index++)
{
TMessageExecutor executor = ObjectContainer.Current.Resolve();
_workers.Add(new Worker(() => ProcessMessage(executor)));
}

command process very important design change

current for the commands of a single aggregate, aggregate execute command one by one. That means one command's event must be persisted to the event store, then the next command can allow be execute.

But the better way is, the next command can be execute immediately if the current command was already generated and committed the event to event service. That means we can use group commit even for one aggregate's events.

This idea can greatly improve the performance of the single aggregate's command mailbox execution.

support enode web admin

  1. support view aggregate status;
  2. support remove aggregate from memory cache.
  3. other functionalities;

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.