先上一张本文所描述的适用场景图

分布式场景,共3台server:

  1. 前端Server
  2. Order App Server
  3. Warehouse App Server

功能:

  1. 前端Server可以不停的发送Command到CommandBus,然后由CommandBus分配不同的Command到各自的app server去处理。
  2. 前端Server可以只发送Command而不必等待Response
  3. 前端Server可以同步等待Response返回
  4. MSMQ消息超过3.5M会自动转为网络共享方式传输消息
  5. 对于同一Command的处理,可以通过增加App Server的方式来提高并发处理速度(比如:可以开2个app server instance来同时处理ACommand的处理)
  6. 在App server中能读取前端Server的Session value(写Session还不支持)

本文目标是用msmq实现分布式CommandBus的应用(已经更新到A2D Framework中了)。

前端Server发送Command的方式(异步):

ACommand cmd = new ACommand() { Tag = "aaa" };
CommandBusDistributer<ACommand, ACommandResult> cmdDistributer = new CommandBusDistributer<ACommand, ACommandResult>();
cmdDistributer.ResultCatached += new CommandResultCatchedDelegate<ACommandResult>(cmdDistributer_ResultCatached);
cmdDistributer.SendRequest(cmd);

同步方式:

ACommand cmd = new ACommand() { Tag = "aaa" };
CommandBusDistributer<ACommand, ACommandResult> cmdDistributer = new CommandBusDistributer<ACommand, ACommandResult>();
cmdDistributer.SendRequest(cmd);
ACommandResult result=cmdDistributer.WaitResponse();

配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<CommandBusSetting><AutoCreateIfNotExists>true</AutoCreateIfNotExists><WebSessionSupport>true</WebSessionSupport><CommandQueue>PC-20130606HCVP\private$\Commands_{0}</CommandQueue><ResponseQueue>PC-20130606HCVP\private$\CommandResponses</ResponseQueue><NetworkLocation>\\PC-20130606HCVP\network</NetworkLocation>
</CommandBusSetting>

Command的编写方式:

[QueueName("ACommand")]//这个可选,没有QueueName时,默认对应的msmq队列名为类名,此处为ACommand
public class ACommand : BaseCommand  //需要继承自BaseCommand
{public string Tag { get; set; }//自定义的属性
}

后端App Server的编写

CommandHandlerHost1: Console程序,相当于App Server 1,会处理部分Command

static void Main(string[] args){Thread.Sleep(2000);CommandHandlerListener listener = new CommandHandlerListener();listener.AddHandler(new TestCommandHandlers());listener.AddHandler(new Test2CommandHandlers());listener.Start();Console.ReadKey();}

CommandHandlerHost2: Console程序,相当于App Server 2,会处理部分Command

static void Main(string[] args){Thread.Sleep(2000);CommandHandlerListener listener = new CommandHandlerListener();listener.AddHandler(new Test3CommandHandlers());listener.Start();Console.ReadKey();}

CommandHandlers: 所有的Command处理函数都会在这个项目中实现

public class TestCommandHandlers : ICommandHandlers,ICommandHandler<ACommand, ACommandResult>,ICommandHandler<BCommand, BCommandResult>{public ACommandResult Handler(ACommand cmd, ISessionContext session){Console.WriteLine("From [public ACommandResult Handler(ACommand cmd)]: " + cmd.Tag);ACommandResult result = new ACommandResult();result.Result = "result from ACommand";return result;}public BCommandResult Handler(BCommand cmd, ISessionContext session){Console.WriteLine("From [public BCommandResult Handler(BCommand cmd)]: " + cmd.Tag);if (session != null){Console.WriteLine("session not null");object o = session.GetWebSession("key1");if (o != null){Console.WriteLine("From Session['key1']: " + Convert.ToString(o));//session.Set("key1", "changed from command handler: " + DateTime.Now);
                }}BCommandResult result = new BCommandResult();result.Result = "result from BCommand";return result;}}

下面是目前的性能测试:

下载代码

转载于:https://www.cnblogs.com/aarond/p/CommandBus.html

支持异步同步的分布式CommandBus MSMQ实现 - 支持Session传递、多实例处理相关推荐

  1. 迷你机2迷你机方案烧写,支持0.75-5.5Kw,异步同步永磁,BLDc电机高性能矢量变频器

    迷你机2迷你机方案烧写,支持0.75-5.5Kw,异步同步永磁,BLDc电机高性能矢量变频器,支持0.1Hz vF,矢量启动,0.3Hz/150%转矩,0.1s启停,对过压限制,过流抑制,高效的软件转 ...

  2. 微信 SDK 升级,全面支持异步缓存接口, .NET 3.5/4.0版本5月1日起停止更新

    简介 Senparc.Weixin SDK 是目前使用率最高的微信 .NET SDK,也是国内最受欢迎的 .NET 开源项目之一. 使用 Senparc.Weixin,您可以方便快速地开发微信全平台的 ...

  3. python协程详解_对Python协程之异步同步的区别详解

    一下代码通过协程.多线程.多进程的方式,运行代码展示异步与同步的区别. import gevent import threading import multiprocessing # 这里展示同步和异 ...

  4. 分布式事务seata只支持MySQL_阿里分布式事务框架Seata原理解析

    Seata框架是一个业务层的XA(两阶段提交)解决方案.在理解Seata分布式事务机制前,我们先回顾一下数据库层面的XA方案. 1. MySQL XA方案 MySQL从5.7开始加入了分布式事务的支持 ...

  5. Django 3.0 正式发布,开始支持异步功能

    Django 3.0 发布了,此版本带来了一些新特性,其中最值得关注的应当是其开始支持异步功能. 此前我们报导过,有草案提出要让 Django 支持异步.聚集于 HTTP 中间件视图和 ORM,开发者 ...

  6. 异步同步、阻塞非阻塞、异步回调、线程队列和协程

    今天学习了异步同步.阻塞非阻塞.异步回调.线程队列和协程 一.异步同步和阻塞非阻塞 线程的三种状态: 1.就绪 2.运行 3.阻塞 阻塞:遇到了IO操作  代码卡住  无法执行下一行  CPU会切换到 ...

  7. 异步/同步、阻塞/非阻塞的理解

    异步/同步.阻塞/非阻塞的理解 [同步和异步] 通俗的讲: 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式.  异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个 ...

  8. (107)FPGA面试题-Verilog编写200ns异步/同步低有效复位激励

    1.1 FPGA面试题-Verilog编写200ns异步/同步低有效复位激励 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-Verilog编写200ns ...

  9. ajax get 缓存 ie,Ajax异步同步请求被IE缓存的问题解决方法(get方式)

    Ajax异步同步请求被IE缓存的问题解决方法(get方式) 分类:Javascript| 发布:佚名| 查看: | 发表时间:2014/1/20 折腾了半天,程序中使用jquery的load方法进行请 ...

最新文章

  1. 基础篇 第四节 项目进度计划编辑 之 任务关联性设定
  2. 干货|简单理解逻辑回归基础
  3. php删除指定符号,利用PHP删除特殊符号
  4. 【算法知识】详解希尔排序算法
  5. IOS pushViewController如何去隐藏tabbar
  6. Hive 1.2.1SparkSqoop安装指南
  7. startssl申请免费ssl证书
  8. yarn publish错误
  9. MongoDB,还有一个角度看数据
  10. 计算机硬件技术基础第四章ppt,管理N计算机硬件技术基础第4章.ppt
  11. c语言递归函数奇偶归一猜想,计算机科学视角下的奇偶归一猜想
  12. 用python做个网络爬虫
  13. python数据展示的模块_python中使用mock模块返回数据
  14. [模拟][字符串]计算器的改良
  15. 零基础起步Keras+LSTM+CRF的实践命名实体识别NER
  16. “Python小屋”1300篇历史文章分类速查表
  17. ONLYoffice在线编辑的接口测试
  18. matlab读取数据流,【OpenBCI】(1):Matlab实时读取数据流(labstreaminglayer)
  19. MapWinGis学习(一) 新建图层 在指定点上打上图标
  20. WPF开发经验-实现Win10虚拟触摸键盘

热门文章

  1. [笔记]何为Linux及其文件系统(四)
  2. HTML5 Canvas 绘制库存变化折线 增加超储告罄线
  3. sigsuspend的理解
  4. 2021年的“金九银十”你准备好了吗?,腾讯、字节、百度、阿里、快手等一线互联网公司面试真题分享
  5. Java 垃圾回收机 GC Roots详解(Garbage Collection Roots)
  6. requestLayout 无效
  7. 世界未解之谜之----------Android Gradle
  8. 如何查看方法在哪里被调用
  9. 第五周项目一-三角形类雏形(5)
  10. Mybatis中的模糊查询