开源地址:https://github.com/tangxuehua/enode

上一篇文章,介绍了enode框架的物理部署思路。本文我们再简单分析一下Command Service的API设计:

Command Service在enode框架中的地位非常重要,用户使用enode框架的主入口就是command service。UI层如controller会通过发送command给command service,然后框架就开始处理该command。不然看出,command service有可能会被高并发的访问。那么command service该提供什么样的API呢?

首先command service的职责是什么?是处理controller发送过来的command,那如何处理呢?大方向一般就两种,即同步执行command和异步处理command;同步的时候,用户希望command完全处理完才返回,中间如果遇到任何错误,就报异常,然后controller会捕获该异常,然后做后续处理;一般用户希望马上知道command有没有执行成功时,会用同步的方法来执行command。异步处理command,用户只需要把command发送给command service,然后不用等待command处理完成。但是用户可能希望知道command什么处理完成了,所以需要提供一个回调函数,通过回调函数来通知用户某个command处理完成了,一般异步编程的风格都会有回调函数的设计。基于上面的分析,enode的ICommandService接口的设计如下:

    /// <summary>Represents a service to send or execute command.
/// </summary>
public interface ICommandService
{
/// <summary>Send a command asynchronously.
/// </summary>
void Send(ICommand command, Action<CommandAsyncResult> callback = null);
/// <summary>Execute a command synchronously.
/// </summary>
void Execute(ICommand command);
}

代码应该很清晰了,就不解释了。如果我们追求最快的用户可用性,那可以选择异步执行command,即调用send方法;如果每次都希望command执行完才返回,则可以使用同步执行command,即execute方法;目前框架中同步执行command的实现原理其实是在异步的基础上加了一个同步控制,

优点:

  1. 框架内部对command的处理流程可以完全一致了,不必因为需要同步和异步的处理而设计重复的代码,当然,我们可以做一些抽象,以减少重复的代码,但实际上这比较困难;
  2. 内部都是异步处理可以很方便的实现command的重试机制;
  3. 利用ManualResetEvent实现异步同步化,我们可以很方便的实现command的处理超时控制;
  4. 因为内部所有command的处理都是异步的,也就是所有的command都在固定的一些队列中排队等候处理,而队列的消费者,即处理command的线程我们在框架启动时就做了配置,所以访问domain in memory的并发线程数量可控,这样我们就可以一定程度上降低并发冲突的可能性;

缺点:

用户调用ICommandService.Execute方法法执行某个command时,他的意图是希望马上执行某个command并返回结果;但是我们现在内部并不是马上处理该command,而是先排队,然后用ManualResetEvent卡住当前线程,然后当command处理完成后,才允许当前线程继续往下走。当然,如果command迟迟未被执行(默认是10秒),则会自动超时,然后返回给command发起者;这样做的坏处是当并发很高的时候,同步执行command可能会超时;对于这一点,在这篇博文中已经对如何提高系统的“高吞吐量、低延迟、高可用”做了比较详细的思路分析,还没看过的朋友可以去看一下。

ENode 1.0 - Command Service设计思路的更多相关文章

  1. 万字详解TDengine 2.0整体架构设计思路

    ​导读:涛思数据8月3日将TDengine 的集群功能开源,TDengine具有超强的性能和功能,为什么能做到?它到底有哪些技术创新?今将TDengine的整体设计文档分享出来. 1: 数据模型 物联 ...

  2. 读懂Swift 2.0中字符串设计思路的改变

    Swift提供了一种高性能的,兼容Unicode编码的String实现作为标准库的一部分.在 Swift2中,String类型不再遵守CollectionType协议.在以前,String类型是字符的 ...

  3. ENode 2.0

    ENode 2.0 - 介绍一下关于ENode中对Command的调度设计 摘要: CQRS架构,C端的职责是处理从上层发送过来的command.对于单台机器来说,我们如何尽快的处理command呢? ...

  4. ENode 1.0 - Staged Event-Driven Architecture思想的运用

    开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架的command service api设计思路.本文介绍一下enode框架对St ...

  5. ENode 2.0 - 介绍一下关于ENode中对Command的调度设计

    CQRS架构,C端的职责是处理从上层发送过来的command.对于单台机器来说,我们如何尽快的处理command呢?本文想通过不断提问和回答的方式,把我的思考写出来. 首先,我们最容易想到的是使用多线 ...

  6. ENode 1.0 - 消息的重试机制的设计思路

    项目开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架中消息队列的设计思路,本文介绍一下enode框架中关系消息的重试机制的设计思路 ...

  7. ENode 1.0 - 消息队列的设计思路

    开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架内部的整体实现思路,用到了staged event-driven architec ...

  8. ENode框架单台机器在处理Command时的设计思路

    设计目标 尽量快的处理命令和事件,保证吞吐量: 处理完一个命令后不需要等待命令产生的事件持久化完成就能处理下一个命令,从而保证领域内的业务逻辑处理不依赖于持久化IO,实现真正的in-memory: 保 ...

  9. enode框架step by step之消息队列的设计思路

    enode框架step by step之消息队列的设计思路 enode框架系列step by step文章系列索引: enode框架step by step之开篇 enode框架step by ste ...

随机推荐

  1. 解决canvas转base64/jpeg时透明区域变成黑色背景的方法

    最近在工作遇到一个问题,在将png图片转jpeg时,透明区域被填充成黑色,通过网上的介绍找到了解决的方法,现在总结下分享给同样遇到这个问题的朋友们,感兴趣的可以通过本文详细学习下. 在用canvas将 ...

  2. 微信公众账号开发之N个坑(二)

    上篇说到微信公众账号的几个坑,前面五个,已经说到菜单,宝宝继续往下赘述了.可惜,还不知道宝宝的宝宝到底是不是心疼宝宝呢,完了,我凌乱了... 回到正题,我们就不吐槽其他的了,上一篇说到微信的菜单了,那 ...

  3. .net中从GridView中导出数据到excel(详细)

    1,创建数据源 找到要导出的GridView中的数据. 2,重写VerifyRenderingInServerForm方法. public override void VerifyRenderingI ...

  4. ZOJ3792_Romantic Value

    给出图,使得两点无流量,剩余其他边的总容量与删除边数的比值. 要机智啊... 因为原图给的边数不超过1000,容量也不超过1000,可以这样把边的容量变为2000*c+1.这样跑出最大流后,最大流除以 ...

  5. 类Collections的静态方法

    类Collections的静态方法 此类完全由在 collection 上进行操作或返回 collection 的静态方法组成. 排序 static <T extends Comparable& ...

  6. 前端开发面试知识点大纲--摘自jackyWHJ

    前端开发面试知识点大纲:HTML&CSS:    对Web标准的理解.浏览器内核差异.兼容性.hack.CSS基本功:布局.盒子模型.选择器优先级及使用.HTML5.CSS3.移动端适应 Ja ...

  7. c# GridView有关RowClick事件,可单击显示选中的row

    //当前选定行 int i = this.gridView1.FocusedRowHandle; //选中行,列名为name的值 gridView1.GetRowCellDisplayText(i, ...

  8. ASP.NET页面之间传递值的几种方式

    目录 QueryString Session Cookie Application 一.QueryString QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中. ...

  9. 原生ajax基础

    /*ajax对象的成员常用属性:responseText:以字符串形式接收服务器端返回的信息responseXML:以Xml Document对象形式接收服务器返回的信息readyState:返回当前 ...

  10. [转]MySQL批量更新死锁案例分析

    文章出处:http://blog.csdn.net/aesop_wubo/article/details/8286215 问题描述 在做项目的过程中,由于写SQL太过随意,一不小心就抛了一个死锁异常, ...