.NET Core 实践二:事件通知和异步处理
首先让我们来先看一个例子:

这是一个简单的用户下单购买商品的业务模型,输入端是用户,相关物料有订单和货物,相关的内部服务有业务(订单)、财务(支付)、仓储(备货)和物流(运输)。
从图中我们可以看到,用户首先向业务部门下了一个订单,业务部门根据用户提供的内容生成了一份订单给客户,并要求客户根据订单金额支付费用。此时用户会拿着订单向财务部门付款,财务部门收款后告诉业务部门,此订单的货款已经收到,业务部门通知仓储部门备货,仓储部门备货完成后通知业务部门货物已经准备完毕,再由业务部门通知物流部门去仓库取货并送给用户,最后用户签收,流程结束。
在这个流程中我们可以发现,总共十个步骤中,除了创建订单、付款和签收外,其他的用户实际上并不关心。在生活中,我们实际上是付完款就回家等着收货了。如果我们把上述四个部门看作四个微服务,并同步调用,则运算模型如下:

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

如上图所示,当用户发起一个请求后(支付货款),先处理与支付相关的业务逻辑,然后立刻将处理结果(支付成功,等待收货)反馈给用户,这时用户的前台流程就告一段落了。在此之后,我们通过一种方式通知其它相关的微服务(订单、仓储、物流),告知他们要进行哪些工作。这些业务一般不需要即时反馈,因此前台人员并不需要等待他们反馈结果,可以直接接受下一个任务。
在这种模型下,我们在微服务之外引入了事件通知服务(如 AWS SNS),当微服务向通知服务发布事件时,只会向通知服务中持久化一条数据,然后微服务就执行完毕并向调用者即时反馈结果了。此后,再由事件通知服务在合适的时候远程调用其他微服务的回调函数,完成业务流程。
事件通知异步调用可以在一定程度上提升微服务的性能和吞吐量,并且各大云服务提供商都有提供类似的服务,如亚马逊云的SNS服务,腾讯云的CMQ服务,阿里云的Message Service等,都可以轻松的集成到项目当中。
但是,异步调用也存在一些不足:
1. 如果发布时发生异常,消息可能会丢失,导致业务流程永久性暂停。如:付款后未能通知业务部门,导致仓储没有备货、物流没有运输,最终用户拿不到货物。
2. 如果微服务回调函数发生异常,可能导致最终数据不一致。如:仓储备货过程出错,但是业务和物流部门都以为已经备好货了,业务部门告知用户已经开始运输,物流部门却没有取到货,最终用户依然拿不到货。然而业务部门发布的事件已经调用过物流部门的回调函数,虽然没有成功,但是发布的消息却已经被消费掉了,业务部门也没有办法重新发送事件通知给仓储,所以这件事只能线下处理(运维人员手动修改数据)。
要保证数据一致性和服务可靠性,就不得不提到消息队列和分布式事务。
“消息队列”是在消息的传输过程中保存消息的容器,我将会在下一篇中探讨消息队列的相关内容。谢谢!
转载自:https://www.cnblogs.com/TO-WW/p/7309544.html
.NET Core 实践二:事件通知和异步处理的更多相关文章
- SQL Server 事件通知(Event notifications)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) 事件通知监控DDL(NotifyQue ...
- PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)
源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkP ...
- Caddy源码阅读(二)启动流程与 Event 事件通知
Caddy源码阅读(二)启动流程与 Event 事件通知 Preface Caddy 是 Go 语言构建的轻量配置化服务器.https://github.com/caddyserver/caddy C ...
- ASP.NET Core 3.x启动时运行异步任务(一)
这是一个大的题目,需要用几篇文章来说清楚.这是第一篇. 一.前言 在我们的项目中,有时候我们需要在应用程序启动前执行一些一次性的逻辑.比方说:验证配置的正确性.填充缓存.或者运行数据库清理/迁移等 ...
- Linux内核基础--事件通知链(notifier chain)
转载: http://blog.csdn.net/wuhzossibility/article/details/8079025 http://blog.chinaunix.net/uid-277176 ...
- 如何扩展分布式日志组件(Exceptionless)的Webhook事件通知类型?
写在前面 从上一篇博客高并发.低延迟之C#玩转CPU高速缓存(附示例)到现在又有几个月没写博客了,啥也不说,变得越来越懒了,懒惰产生了拖延后遗症. 最近一周升级了微服务项目使用的分布式日志组件Exce ...
- 9.5 dubbo事件通知机制
dubbo事件通知机制:http://dubbo.io/books/dubbo-user-book/demos/events-notify.html 一.使用方式 两个服务: DemoService: ...
- Linux内核基础--事件通知链(notifier chain)good【转】
转自:http://www.cnblogs.com/pengdonglin137/p/4075148.html 阅读目录(Content) 1.1. 概述 1.2.数据结构 1.3. 运行机理 1. ...
- c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)
c#封装DBHelper类 public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...
随机推荐
- now
- Shell变量类型和运算符-2
- 51nod OJ P1000 A+B
P1000 A+B OJ:51Nod 链接:"http://www.51nod.com/Challenge/Problem.html#!#problemId=1000" 题目描述: ...
- Hive数仓之快速入门(二)
上次已经讲了<Hive数据仓库之快速入门一>不记得的小伙伴可以点击回顾一下,接下来我们再讲Hive数据仓库之快速入门二 DQL hive中的order by.distribute by.s ...
- 2.AsyncQueryHandler、内容提供者
会话页面 Test :测试 public class Test extends AndroidTestCase{ public void test(){ Uri uri = Uri.parse(&qu ...
- 微信小程序中的app.js-清除缓存
微信小程序中的app.js 关于小程序app.js生命周期的介绍 App(Object) App() 函数用来注册一个小程序.接受一个 Object 参数,其指定小程序的生命周期回调等. App() ...
- Python遍历List集合四种方法
这篇文章主要介绍了Python 列表(List) 的四种遍历方法实例 详解的相关资料,需要的朋友可以参考下 分别是:直接遍历对象 通过索引遍历 通过enumerate方法 通过iter方法. 使用Py ...
- Kali学习笔记28:Burpsuite(下)
文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 扫描: 上一篇介绍到了爬网,那么到这里我以及爬取了一个 ...
- 一句话的事儿,Head first 设计模式
head first 设计模式,是比较有趣的一本设计模式的书. 在学校里看书和在工作时看书,意义是不一样的.在学校时是为读书而读书,我们可以从0到1,我们有的是时间.但是工作后就不一样. 我觉得这时的 ...
- 用 VSCode 编写 python
一.coding 1.选择一个Python解释器 通过命令选项板(⇧⌘P),键入Python:Select Interpreter命令,然后选择一个解释器. 成功后左下角出现: 2.运行代码 二.重构 ...