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

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

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

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

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

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

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

在这种模型下,我们在微服务之外引入了事件通知服务(如 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. echarts 调整图表 位置 的方法

    ###内部图表大小是与div容器大小位置相关的,如果想调整图表大小位置,调整div的属性就可以了### ###如果是想调整图表与div间上下左右留白,则设置grid属性就可以了### 如图所示: 具体 ...

  2. EF学习笔记(七):读取关联数据

    总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本篇参考原文链接:Reading Related Data 本章主要讲述加载显示关联数据: 数据加载分为以下三种 Lazy l ...

  3. Scala知识点汇总

    Scala数组小结 1.定长数组 定长数组:指长度不可变的数组Array.第一种方式:先声明一个数组,后初始化该数组: scala> val array = new Array[Double]( ...

  4. HDU1263水果

    //#include<bits/stdc++.h> #include<map> #include<cstdio> #include<string> #i ...

  5. dubbo 源码学习1 服务发布机制

    1.源码版本:2.6.1 源码demo中采用的是xml式的发布方式,在dubbo的 DubboNamespaceHandler 中定义了Spring Framework 的扩展标签,即 <dub ...

  6. configSections必须是根节点下第一个节点

    对webconfig文档进行配置,添加了一个节点configSectionS,添加时,我自个想,按节点的名称以字母排序,就放在appSettings节点下. 谁知,在程序运行时,出现了错误: 参考上面 ...

  7. 背水一战 Windows 10 (110) - 通知(Tile): secondary tile 模板之基础, secondary tile 模板之文本

    [源码下载] 背水一战 Windows 10 (110) - 通知(Tile): secondary tile 模板之基础, secondary tile 模板之文本 作者:webabcd 介绍背水一 ...

  8. js高级笔记

    定时器this指向window javascript 的执行过程 预解析(变量) 数据集和功能集---- 对象 对象----属性和方法 -------------------面向对象--------- ...

  9. .net core 发布linux报错“The configured user limit (128) on the number of inotify instances has been reached”

    https://stackoverflow.com/questions/45875981/error-while-reading-json-file-in-dotnet-core-the-config ...

  10. Git使用详细教程(3):git add, git commit详解

    在使用git之前,我们首先要初始化一个git管理的仓库,这里以博客(blog)为例 git init blog 我们进入目录,执行git status查看git状态,可以看到一个新的git管理的项目目 ...