专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

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

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

72_1.png

分布式场景,共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的编写

72_2.png

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;
        }
    }

下面是目前的性能测试:

72_3.png

下载代码

文章永久链接:https://tech.souyunku.com/38966

未经允许不得转载:搜云库技术团队 » 支持异步同步的分布式CommandBus MSMQ实现 - 支持Session传递、多实例处理

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们