首页 > 代码库 > 搭个事件驱动的架子:异步与效率

搭个事件驱动的架子:异步与效率

问题出现在我当前参与的系统中,本系统需要与公司已存在的多个子系统进行协作,整个架构类似这样:

上层Client,各种客户端

中层应用层,方便业务操作,进行业务整合,通过API与下层服务应用衔接,暴露接口为上层客户端提供数据。

下层服务层,单独部署的内部应用服务,不同部门自主管理。

最下层数据持久,公司自己开发的云部署环境,一次提交自动编译,自动发布。

 

问题

个人主要开发工作围绕应用层,需要对下层服务模块进行调用,但是由于历史遗留问题以及业务要求,每次应用层的操作(提交),需要跨模块进行数据校验,最终提交到多个分布式的子系统中。

由于【数据完整】是作为系统最重要的原则,所以需要多次进行校验,整个应用层的业务操作就变得相当耗时(跨多个系统进行数据校验,网络IO耗时等),严重影响了应用层用户的使用体检,使得整个系统在效率上大打折扣。

 

解决方案

针对于系统性能解决方法,本人认为最简单的三种方式:【异步】【缓存】【并行】。

【1】对校验规则建立校验方程式,异步的方式缓存到应用系统中,减少在for循环中多次网络IO(跨模块)校验的耗时,但是产生的新问题是对于缓存时间段内的新产生数据的可能会影响最终的数据一致性,考虑暂时舍弃。

【2】于是最简单的方案是将耗时的操作(网络校验)以异步的方式实现;

.net中的异步操作

在4.5之后可以通过Task简单的实现异步执行:

        static void Main(string[] args)        {            for (int i = 0; i < 100; i++)            {                AsyncMethod(i);            }            Console.ReadKey();        }

  

        #region 异步方式一        // 异步操作        private static async void AsyncMethod(int input)        {            Console.WriteLine("{0}进入异步操作!", input);            var result = await AsyncWork();            Console.WriteLine("最终结果{0}", result);            Console.WriteLine("{0}退出异步操作!", input);        }        // 模拟耗时操作(异步方法)        private static async Task<bool> AsyncWork()        {            await Task.Delay(3000);            return true;        }        #endregion

  

        #region 异步方式二        public static void AsyncMethod(int input)        {            Console.WriteLine("{0}进入异步操作!", input);            Task.Factory.StartNew(() =>            {                System.Console.WriteLine("{0}耗时操作中...", input);                Thread.Sleep(3000);                System.Console.WriteLine("{0}耗时操作结束", input);            });        }        #endregion

执行结果

可以看到系统同步执行过程中循环并没有因为等待而阻塞任务,更多的解决方案希望在之后的工作中尝试出来,还是三个词【异步】【缓存】【并行】。

 

搭个事件驱动的架子:异步与效率