首先让我们来先看一个例子:

这是一个简单的用户下单购买商品的业务模型,输入端是用户,相关物料有订单和货物,相关的内部服务有业务(订单)、财务(支付)、仓储(备货)和物流(运输)。

从图中我们可以看到,用户首先向业务部门下了一个订单,业务部门根据用户提供的内容生成了一份订单给客户,并要求客户根据订单金额支付费用。此时用户会拿着订单向财务部门付款,财务部门收款后告诉业务部门,此订单的货款已经收到,业务部门通知仓储部门备货,仓储部门备货完成后通知业务部门货物已经准备完毕,再由业务部门通知物流部门去仓库取货并送给用户,最后用户签收,流程结束。

在这个流程中我们可以发现,总共十个步骤中,除了创建订单、付款和签收外,其他的用户实际上并不关心。在生活中,我们实际上是付完款就回家等着收货了。如果我们把上述四个部门看作四个微服务,并同步调用,则运算模型如下:

从图中我们可以看出,用户发起一个请求(支付货款)后,将按照顺序一步一步的执行所有的步骤,直到用户取到货物才能结束,如果这段时间比较长,则需要用户一直等待结果,直到用户等的不耐烦离开(响应超时)。先不论用户体验如何,这种模型的处理效率实在是过于低下,如果货物运送需要若干天,则业务流程就要堵塞若干天,新的业务就进不来。

如果我们设计一种新的处理模型,在用户支付完成后,把这些用户不关心的环节放到后台处理,就可以极大的提升处理效率,增加吞吐量。

如上图所示,当用户发起一个请求后(支付货款),先处理与支付相关的业务逻辑,然后立刻将处理结果(支付成功,等待收货)反馈给用户,这时用户的前台流程就告一段落了。在此之后,我们通过一种方式通知其它相关的微服务(订单、仓储、物流),告知他们要进行哪些工作。这些业务一般不需要即时反馈,因此前台人员并不需要等待他们反馈结果,可以直接接受下一个任务。

在这种模型下,我们在微服务之外引入了事件通知服务(如 AWS SNS),当微服务向通知服务发布事件时,只会向通知服务中持久化一条数据,然后微服务就执行完毕并向调用者即时反馈结果了。此后,再由事件通知服务在合适的时候远程调用其他微服务的回调函数,完成业务流程。

事件通知异步调用可以在一定程度上提升微服务的性能和吞吐量,并且各大云服务提供商都有提供类似的服务,如亚马逊云的SNS服务,腾讯云的CMQ服务,阿里云的Message Service等,都可以轻松的集成到项目当中。

但是,异步调用也存在一些不足:

1. 如果发布时发生异常,消息可能会丢失,导致业务流程永久性暂停。如:付款后未能通知业务部门,导致仓储没有备货、物流没有运输,最终用户拿不到货物。

2. 如果微服务回调函数发生异常,可能导致最终数据不一致。如:仓储备货过程出错,但是业务和物流部门都以为已经备好货了,业务部门告知用户已经开始运输,物流部门却没有取到货,最终用户依然拿不到货。然而业务部门发布的事件已经调用过物流部门的回调函数,虽然没有成功,但是发布的消息却已经被消费掉了,业务部门也没有办法重新发送事件通知给仓储,所以这件事只能线下处理(运维人员手动修改数据)。

要保证数据一致性和服务可靠性,就不得不提到消息队列和分布式事务。

“消息队列”是在消息的传输过程中保存消息的容器,我将会在下一篇中探讨消息队列的相关内容。谢谢!

转载自:https://www.cnblogs.com/TO-WW/p/7309544.html

.NET Core 实践二:事件通知和异步处理的更多相关文章

  1. SQL Server 事件通知(Event notifications)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) 事件通知监控DDL(NotifyQue ...

  2. PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)

    源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkP ...

  3. Caddy源码阅读(二)启动流程与 Event 事件通知

    Caddy源码阅读(二)启动流程与 Event 事件通知 Preface Caddy 是 Go 语言构建的轻量配置化服务器.https://github.com/caddyserver/caddy C ...

  4. ASP.NET Core 3.x启动时运行异步任务(一)

    这是一个大的题目,需要用几篇文章来说清楚.这是第一篇.   一.前言 在我们的项目中,有时候我们需要在应用程序启动前执行一些一次性的逻辑.比方说:验证配置的正确性.填充缓存.或者运行数据库清理/迁移等 ...

  5. Linux内核基础--事件通知链(notifier chain)

    转载: http://blog.csdn.net/wuhzossibility/article/details/8079025 http://blog.chinaunix.net/uid-277176 ...

  6. 如何扩展分布式日志组件(Exceptionless)的Webhook事件通知类型?

    写在前面 从上一篇博客高并发.低延迟之C#玩转CPU高速缓存(附示例)到现在又有几个月没写博客了,啥也不说,变得越来越懒了,懒惰产生了拖延后遗症. 最近一周升级了微服务项目使用的分布式日志组件Exce ...

  7. 9.5 dubbo事件通知机制

    dubbo事件通知机制:http://dubbo.io/books/dubbo-user-book/demos/events-notify.html 一.使用方式 两个服务: DemoService: ...

  8. Linux内核基础--事件通知链(notifier chain)good【转】

    转自:http://www.cnblogs.com/pengdonglin137/p/4075148.html 阅读目录(Content) 1.1. 概述 1.2.数据结构 1.3.  运行机理 1. ...

  9. c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)

    c#封装DBHelper类   public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...

随机推荐

  1. Linux下Memcache服务器端的安装

    最近在研究怎么让Discuz!去应用Memcache去做一些事情,记录下Memcache安装的过程. Linux下Memcache服务器端的安装服务器端主要是安装memcache服务器端,目前的最新版 ...

  2. C#-Database-连接

    using System.Data; using System.Data.SqlClient; //先打开两个类库文件 SqlConnection con = new SqlConnection(); ...

  3. HTML 列表中的dl,dt,dd,ul,li,ol区别及应用

      无序列表 无序列表是一个项目的列表,此列项目使用粗体圆点(典型的小黑圆圈)进行标记. 无序列表始于 <ul> 标签.每个列表项始于 <li>. 有序列表 同样,有序列表也是 ...

  4. springcloud config 提取公共参数

    每个微服务都有自己的配置文件application-local.yml和bootstrap.yml, 这个两个配置文件的读取顺序是先读取bootstrap.yml文件,在读取application-l ...

  5. 河北大学python选修课00次作业

    学习python认为挺好玩的一件事.看到很多关于python的东西在网上,看到有这个课,认为只是选修课,别人也可以选,自己想不能被别人落下,别人都会,我不会可不行. 而且认为python是一个很强大的 ...

  6. 浅析B/S架构数据库连接方式

    前言 在许许多多的B/S架构系统中都涉及到了数据库的链接,那么对于数据库连接的方式有哪些?可能出现的问题是什么?   目录 1.普通连接方式 2.单例模式 3.连接池   分析 普通连接: 下面是我们 ...

  7. JavaScript 基础排序的实现(一)

    作为一个有追求的前端,忙里偷闲(闲得发慌)地复习了一下基础的排序算法,以此文留念. 本篇主要记录O(n²)复杂度的基础算法O(nlogn)的算法将在下次有空(闲得发慌)时更新 在记录时发现Es6语法中 ...

  8. 每天学点SpringCloud(八):使用Apollo做配置中心

    由于Apollo支持的图形化界面相对于我们更加的友好,所以此次我们使用Apollo来做配置中心 本篇文章实现了使用Apollo配置了dev和fat两个环境下的属性配置.Apollo官方文档https: ...

  9. 【ABP杂烩】面向切面编程(AOP)知识总结

    目录 1.存在问题 2.AOP的概念 3.AOP应用范围 3.AOP实现方式 4.应用举例 5.结束语 本文在学习[老张的哲学]系列文章AOP相关章节后,自己归纳总结的笔记. 1.存在问题 最近,其它 ...

  10. odoo开发笔记 -- self详解

    python中一切皆对象! odoo基于python开发,那么odoo中也可以理解成一切皆对象. 我们在python中定义类的时候,一般会用到self,用来表示当前对象自己. 那么odoo中的self ...