资讯中心
News
尽可能使用异步通信
发布时间:2022-09-27 00:00   您所在的位置: 网站首页 > 新闻资讯 > 经验杂谈
尽可能使用异步通信,而不是同步通信。服务和每个层之间的所有调用。使用程序设计语言专有的调用,确保发出了请求,且没有在等待。同步词用会使整个程序执行停止来等待一个响应,从而把所有的展务和每个层维系在一起,造成级联性的故障。使用异步通信技术可以确保每个服务和层是独立的,这样子系统的可扩展水平比所有部件都掲合在一起的系统大得多。

一般的异步伐用,不管是在一个服务内还是在两个服务间,实现起来都比实现同步伐用难得多。原因在于异步伐用通常都必须要通知最初发送消息的服务,告知它请求已经完成了。假如你发送完请求就不再理会,那就没必要再与调用方法通信或协作了。实现这样的的方法好多且很简单,包含如下所示的PHP函数,它利用了符号在后台运行进程。



不过,并不是所有服务发出请求后就不再管它什么状态了。通常,调用方法想知道被调用的方法是什么时候完成的。原因可能是在结果返回前发生了其他的处置。可以设想一个电子商务平台上的场景,即必须要依据抵折扣代码重新计算邮费。理想的情况是同步执行这两个任务,而不是计算邮费(可能必须要调用供应商的第三方法),然后再对购物车中的物品处置折扣代码。但在二者都完成以前,咋们不能把最终结果发送给顾客。

在大多数程序设计语言中有一种机制,是为母方法和被调用的异步子方法之间的协调和通信设计的,叫作回调。在C/C++语言中,这是通过函数指针实现的。在Java语言中,是通过对象引用实现的。有很多设计模式使用回调,如委托设计模式和观察者设计模式。不过为什么要自找麻烦异步伐用方法或服务呢?

咋们之故此要自找麻烦开展异步伐用,是由于假如采用同步伐用,所有的方法、服务和层都会被维系在一起,它们中的任何一个运行放慢或出了故障,都会造成整个系统发生延迟的级联故障。把所有部件串联起来会使得故障成倍增长。咋们只针对可用性讨论了这一概念,但它其实也适用于每KLOC存在bug的概率。假如方法A、B和和C都有99.99%6的机会没有bug,而且A方法同步地调用B方法,B方法同步地调用C方法,那么整个系统的逻辑流中有bug的概率便是99.99%×99.99%×99.9%=99.97%。

咋们介绍过,依据不同的客户,把系统的资源池划分成独立的泳道。这样子做的好处是假如一个泳道出了问题,不可能術生到其他客户的泳道,这可以将问题的决定最小化。此外,检测故障也简单得多,由于同一个代码右采用异步伐用的模块或方法也具有这种能力。

异步伐用可以防止故障或运行减慢这种情况传播,而且有助于在发生问题时确定bug在哪里。很多遇到过数据库问题的人都在应用或Web层见证过这一点,由于一个很慢的查询使得连接受到阻碍堆积起来了,然后应用服务器上的套接字一直保持打开状态。数据库的监控系统可能不可能发出故障信号,但应用的监控系统则会发出故障信号。这种情况是在应用和数据库服务器间使用了同步伐用造成的,而且这种问题还很难诊断。

当然,不能对系统中所有方法和层之间的调用都使用异步伐用,故此真正的问题是什么调用应该采用异步伐用。在使用非异步伐用时,应该具有超时设置,可以在同步伐用的方法或服务失败时,优雅地处置错误或继续开展处置。确定什么调用可以采用异步模式的方法是基于下列标准剖析每个调用。

外部API/第三方。调用的是第三方的方法或外部API吗?假如是,那么一定要采用异步伐用。调用外部方法可能出现的问题太多,故此不能采用同步伐用。你一定不想让自个的系统健康和可用性与你不能控制的系统紧密关联在一起。

长時间运行的进程。要调用的进程是不是运行時间很长?运行的计算需求和1O需求是不是很高?假如是,最好采用异步伐用。运行慢的进程是比停机更棘手的问题。

简单出错的/频繁更改的方法。调用的方法会频繁更改吗?修改的次数越多,代码中有bug的可能性越大。不要把关键代码和必须要频繁更改的代码关联在一起,否则会造成故障数量增加。

時间约束。当两个进程间没有時间约束时,考虑发出请求后就不再管什么状态的子进程。这样的场景可能是新注册的顾客收到一封欢迎邮件。虽然系统关心邮件能否发送出去了,但不应该等待邮件发送出去了才给顾客返回注册页面的结果。

相对确定网站制作能否使用异步伐用来说,这只是几条最重要的标准。咋们把归纳所有标准作为练习留给读者。虽然咋们能再列出十条标准,但伴随着列出标准的增多,它们可能更适用于特定的系统。另外,和你的开发团队一起做这样的练习,这会让团队中的每个人都注意到使用同步伐用和异步伐用的利弊,从而遵循本原则,更好地扩展系统。

本文章由新概念互动原创,如没特殊注明,转载请注明来自:http://www.jianzhan0.com/jingyand/72156.html