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

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

上层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

执行结果

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

时间: 2024-08-05 15:22:58

搭个事件驱动的架子:异步与效率的相关文章

搭个事件驱动的架子:前篇,缘起

缘起 之前的搭架子经验主要是基于[面向接口]的方式开发的,通过接口方式暴露业务规则和定义.依赖的层次与类库通过接口方式进行嫁接. 这种模式适合业务规格较清晰和归纳简单的模块,但是对于某些小粒度, 业务不易归纳的功能与模块来说,想要建立原则与约束就会变成奢望,因为很难抽离出明显的规则与约束. 这对于这点我们希望以纵向的管道方式进行隔离,取代横向的面向对象的建立业务. 业务驱动通道 之前的方式(右侧)为依据规则进行嫁接,左侧(黄色)则是通过建立业务驱动管道的方式进行衔接.特点是:在整个通道的一端进行

【Nginx】事件驱动框架和异步处理

Nginx对请求的处理是通过事件触发的,模块作为事件消费者,只能被事件收集.分发器调用.这与传统的Web服务器是不同的.传统的Web服务器下,一个请求由一个进程消费,请求在建立连接后将始终占用着系统资源,直到连接关闭才会释放资源.这样做有以下缺点: 进程数增加会增加进程间切换的负担,影响系统整体性能. 当某个进程要等待事件发生而处于阻塞状态时,该进程仍然占用内存资源直到该请求结束,造成资源极大浪费. 在Nginx中,接收到一个请求时,不会产生一个单独的进程来处理该请求,而是由事件收集.分发器(进

批量采集世纪佳缘会员图片及winhttp异步采集效率

原始出处:http://www.cnblogs.com/Charltsing/p/winhttpasyn.html 最近老有人问能不能绕过世纪佳缘的会员验证来采集图片,我测试了一下,发现是可以的. 同时也测试了winhttp异步采集的效率.(在vba里面使用winhttp开发速度快) 经过测试,在网站不忙的情况下,检索一万个会员大约只需要三分钟或者更少的时间. 下面简单说一下如何使用winhttp做并发采集: 1.在类模块里面建立winhttp的各种事件,用于处理error和response数据

同步函数与异步函数

依据微软的MSDN上的解说: (1)   同步函数:当一个函数是同步执行时,那么当该函数被调用时不会立即返回,直到该函数所要做的事情全都做完了才返回. (2)   异步函数:如果一个异步函数被调用时,该函数会立即返回尽管该函数规定的操作任务还没有完成. (3) 在一个线程中分别调用上述两种函数会对调用线程有何影响呢? 当一个线程调用一个同步函数时(例如:该函数用于完成写文件任务),如果该函数没有立即完成规定的操作,则该操作会导致该调用线程的挂起(将CPU的使用权交给系统,让系统分配给其他线程使用

(一) 这就是所谓的Node.js------单线程,非阻塞,事件驱动

Node.js 第一天笔记(V1) 一:Node.js到底是从何而来 2008年的秋天,一个名叫做Ryan Dahl(罗伊?达尔)的年轻人在玩了几年服务器编程之后,越发感到服务器高并发性能的瓶颈是一个很难逾越的问题.无论是自己擅长的Ruby on Rails,还是传统的LAMP.以及C或者Lua.都各有各的缺陷.Ruby的虚拟机太烂,C虽然性能比较高,但是天生的语言本身缺憾致使开发Web的效率低下.Lua则是已有的同步I/O问题导致无法发挥性能优势. Ryan使用了这些语言开发Web服务器几年之

QT 异步函数和同步函数交换问题

同步函数与异步函数 依据微软的MSDN上的解说: (1)   同步函数:当一个函数是同步执行时,那么当该函数被调用时不会立即返回,直到该函数所要做的事情全都做完了才返回. (2)   异步函数:如果一个异步函数被调用时,该函数会立即返回尽管该函数规定的操作任务还没有完成. (3) 在一个线程中分别调用上述两种函数会对调用线程有何影响呢? 当一个线程调用一个同步函数时(例如:该函数用于完成写文件任务),如果该函数没有立即完成规定的操作,则该操作会导致该调用线程的挂起(将CPU的使用权交给系统,让系

[转帖]有关异步编程框架的讨论

有关异步编程框架的讨论 https://www.jianshu.com/p/c4e63927ead2 前言 从python的twisted,到之后Java的NIO,Netty,以及Nodejs带着底层libuv的横空出世,以及现在热议的Golang.异步/多线程/协程编程已经成为了一个耳熟能详的编程范式,它从理论上可以最大化cpu利用率和I/O资源,在计算机核数越来越多,服务器端性能要求越来越高的环境下,熟练掌握异步编程模式已经成为了基本要求. 本文我们来梳理一下异步编程到底是怎么回事. 计算机

同步、异步、多线程与事件型综述

转自:http://blog.csdn.net/chszs/article/details/8867174 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs首先要了解什么是阻塞和阻塞式IO.线程在执行中如果遇到磁盘读写或网络通信(统称IO操作),通常要耗费较长的时间,这时操作系统会剥夺此线程的CPU控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式称为阻塞.当IO操作完毕时,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权,令

软件架构(2):同步与异步问题

一.       基本概念 一个大型的程序系统常常是由很多不能功能模块组成的.程序系统运行时不同功能模块要按一定顺序执行,以协同完成一件任务.功能模块协作运行完成一件任务存在同步和异步两种方式.如果在某一时间段,这个程序系统的所有功能模块都在为完成相同的一件任务而服务,某一个功能模块在完成一件任务的子任务后,需要等待其他功能模块完成子任务,这样只有当全部功能模块按顺序完成一件任务后,程序系统才能接收下一个任务,功能模块是串行运行,这称之为同步模式.反之,在某一时间段,这个程序系统的不同功能模块可