支持异步同步的分布式CommandBus MSMQ实现 - 支持Session传递、多实例处理
先上一张本文所描述的适用场景图
分布式场景,共3台server:
- 前端Server
- Order App Server
- Warehouse App Server
功能:
- 前端Server可以不停的发送Command到CommandBus,然后由CommandBus分配不同的Command到各自的app server去处理。
- 前端Server可以只发送Command而不必等待Response
- 前端Server可以同步等待Response返回
- MSMQ消息超过3.5M会自动转为网络共享方式传输消息
- 对于同一Command的处理,可以通过增加App Server的方式来提高并发处理速度(比如:可以开2个app server instance来同时处理ACommand的处理)
- 在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.magicube.ai
心怀远大理想。
为了家庭幸福而努力。
商业合作请看此处:https://www.magicube.ai
标签:
CommandBus
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】