EDA风格与Reactor模式

来源:https://www.cnblogs.com/ivaneye/p/10129896.html

本文将探讨如下几个问题:

  • Event-Driven架构风格的约束
  • EDA风格对架构属性的影响
  • Reactor架构模式
  • Reactor所解决的问题
  • redis中的EventDriven

从观察者模式到EDA风格

GOF的23种设计模式中,有一个观察者模式!个人觉得叫「监听模式」更合理!

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

它和EDA风格有些类似!不过一个应用在代码关系层面;一个应用在架构上!

在EDA中,有三个必要组件:

  • 事件生产组件:对应到观察者模式中,就是引起Subject状态变化的对象。它引起Subject状态变化的动作就是事件。
  • 事件队列:对应到观察者模式中,就是Subject对象。事件生产者产生的事件,会到事件队列中。
  • 事件处理组件:处理事件生产组件所产生的事件。对应到观察者模式中,就是Observer对象。

EDA风格的约束

  • 「事件生产组件」产生事件,将其添加到「事件队列」中
  • 「事件处理组件」监听「事件队列」
  • 当「事件队列」中有自己能处理的事件时,「事件处理组件」将对该事件进行处理
  • 「事件处理组件」处理完事件后,可以将处理结果返回给「事件生产组件」,也可以不返回
  • 「事件生产组件」可以接收「事件处理组件」处理结果,也可以不接收

EDA风格可以细分为Mediator结构和Broker结构!

  • Mediator结构通过一个Mediator组件协调多个步骤间的关系和执行顺序
  • Broker结构则是通过松散的方式来组织多个步骤之间的关系和执行顺序

Mediator结构如下:

在Mediator结构中主要有四个组件:

  • 事件队列(event queue)
  • 事件中介(event mediator)
  • 事件通道(event channel)
  • 事件处理器(event processor)。

执行流程如下:

  • 「事件生产组件」产生事件,将其添加到「事件队列」中
  • 「事件中介」监听「事件队列」
  • 当「事件队列」中有事件时,「事件中介」根据具体的事件,将其拆分/组合为一步步的具体步骤
  • 将具体的步骤添加到对应的「事件通道」中
  • 「事件处理器」从「事件通道」中获取到事件,进行处理

Broker结构如下:

Broker结构中主要包括两个组件:

  • Broker:Broker可被集中或相互关联在一起使用,此外,Broker中还可以包含所有事件流中使用的事件通道。
  • 事件处理器

执行流程如下:

  • 「事件生产组件」产生事件,将其添加到「Broker」中
  • 「事件处理组件」监听「Broker」
  • 当「Broker」中有自己能处理的事件时,「事件处理组件」将对该事件进行处理
  • 「事件处理组件」处理完事件后,发送后续事件到「Broker」中
  • 其它「事件处理组件」接收到自己能处理的事件后,对该事件进行处理,处理完后,可能继续发送事件到「Broker」中
  • 当不再有后续事件时,所有步骤完成

EDA风格对架构属性的影响

  • 性能:由于EDA是个异步架构,对于不需要返回值的请求,它能明显的提高用户可感知的性能。
  • 扩展性:事件生产者和事件消费者松耦合,可以独立进化,可以方便的进行功能扩展。同时由于,可以方便的添加事件消费者,故而进一步提高了扩展性。
  • 伸缩性:事件生产者和事件消费者松耦合及可以方便的添加事件消费者,使得EDA有很好的伸缩性
  • 可维护性:事件生产者和事件消费者松耦合,且和一般的调用方式相比,在理解上有一定的难度,使得开发难度增加,但单元测试较方便。而由于EDA的异步性,使得集成测试比较麻烦。可维护性一般
  • 可运维性:事件生产者和事件消费者松耦合,可独立部署,可运维性相对较容易
  • 灵活性:高度可扩展,易于伸缩使得EDA有较高的灵活性

Reactor架构模式

Reactor架构模式,是EDA风格的一种实现!它是为了处理:

  • 高并发IO请求
  • 其中请求所包含的数据量不大
  • 每个请求处理耗时不长

Reactor模型,有四个组件:

  • Acceptor:Acceptor接受Client连接。属于EDA「事件队列组件」。
  • Channel:接收IO事件。属于EDA「事件队列组件」。
  • Reactor:监听Channel和Acceptor,当发生连接事件或IO事件时,将其派发给对应的Handler。属于EDA「事件队列组件」。
  • Handler:和一个Client通讯的实体,进行实际的业务处理。对应EDA的「事件处理组件」。

Client属于EDA的「事件生产组件」!

Reactor可以分为:单线程模型,多线程模型和主从Reactor模型

  • 单线程模型

Reactor轮询到消息后,就直接委托给Handler去处理,处理完后,再进行后面的轮询,即一个Handler处理完之后,才能进行下一个Handler的处理!如果某个handler耗时较长,就会阻塞后续的handler的执行!

  • 多线程模型

Reactor多线程模型就是将Handler中的IO操作和非IO操作分开,操作IO的线程称为IO线程,非IO操作的线程称为工作线程!这样的话,客户端的请求会直接被丢到线程池中,客户端发送请求就不会堵塞!

但是当用户进一步增加的时候,Reactor会出现瓶颈!因为Reactor既要处理IO操作请求,又要响应连接请求!为了分担Reactor的负担,所以引入了主从Reactor模型!

  • 主从Reactor模型

主Reactor用于响应连接请求,从Reactor用于处理IO操作请求!

详细内容可参考之前的博文《高性能Server---Reactor模型》!

这里简单说下,为什么Reactor中,请求的数据量不能太大,请求处理时间为什么不能太长!

其实很好理解,如果请求数据量太大、处理时间很长!即使是主从Reactor模型,线程池也会被耗尽!耗尽后,导致后续的请求积压。

Reactor解决的是传统BIO模型下,Server并发处理请求的能力受限于系统所能创建的线程数的问题!

redis中的EventDriven

redis使用了「Event-driven programming」来处理指令,「Event-driven programming」是一种编程范式,也可以说是EDA的代码实现。redis中的实现,类似Reactor单线程模型!

事件驱动程序设计是一种计算机程序设计模型。与传统上一次等待一个完整的指令然后再做运行的方式不同,事件驱动程序模型下的系统,基本上的架构是预先设计一个事件循环所形成的程序,这个事件循环程序不断地检查目前要处理的信息,根据要处理的信息运行一个触发函数进行必要的处理。其中这个外部信息可能来自一个目录夹中的文件,可能来自键盘或鼠标的动作,或者是一个时间事件。

简单的看一下代码:

// server.cint main(int argc, char **argv) {......aeMain(server.el);  // 进入事件监听轮询,轮询注册上来的文件句柄......
}// ae.cvoid aeMain(aeEventLoop *eventLoop) {eventLoop->stop = 0;          // eventLoop相当于Reactor模式中的Reactor组件while (!eventLoop->stop) {if (eventLoop->beforesleep != NULL)eventLoop->beforesleep(eventLoop);aeProcessEvents(eventLoop, AE_ALL_EVENTS|AE_CALL_AFTER_SLEEP);}
}int aeProcessEvents(aeEventLoop *eventLoop, int flags)
{......numevents = aeApiPoll(eventLoop, tvp);// select,epoll,evport,kqueue底层实现,获取事件......// 将事件委托给具体的Handler去处理for (j = 0; j < numevents; j++) {aeFileEvent *fe = &eventLoop->events[eventLoop->fired[j].fd];int mask = eventLoop->fired[j].mask;int fd = eventLoop->fired[j].fd;int fired = 0; int invert = fe->mask & AE_BARRIER;if (!invert && fe->mask & mask & AE_READABLE) {fe->rfileProc(eventLoop,fd,fe->clientData,mask);fired++;}if (fe->mask & mask & AE_WRITABLE) {if (!fired || fe->wfileProc != fe->rfileProc) {fe->wfileProc(eventLoop,fd,fe->clientData,mask);fired++;}}if (invert && fe->mask & mask & AE_READABLE) {if (!fired || fe->wfileProc != fe->rfileProc) {fe->rfileProc(eventLoop,fd,fe->clientData,mask);fired++;}}processed++;}......
}// ae.h
// aeFileEvent的结构如下,在构建时,就将处理程序赋给了其中的aeFileProc
// 在上面的轮询中,直接取出来执行即可
typedef struct aeFileEvent {int mask; /* one of AE_(READABLE|WRITABLE|BARRIER) */aeFileProc *rfileProc;aeFileProc *wfileProc;void *clientData;
} aeFileEvent;

下面以我们启动redis-server和redis-cli这个流程,来简单的说明下redis的执行流程:

//redis-server启动后,进入轮询状态,等待事件
//启动时构建了一个tcpHandler,用于处理客户端连接// server.c
for (j = 0; j < server.ipfd_count; j++) {if (aeCreateFileEvent(server.el, server.ipfd[j], AE_READABLE,acceptTcpHandler,NULL) == AE_ERR){serverPanic("Unrecoverable error creating server.ipfd file event.");}
}//redis-cli启动后,eventLoop轮询到连接事件,触发tcpHandler,根据获取到的文件句柄,构建aeFileEvent,同时设置readQueryFromClient Handler,用于处理后续的客户端的指令
client *createClient(int fd) {......if (aeCreateFileEvent(server.el,fd,AE_READABLE,readQueryFromClient, c) == AE_ERR){close(fd);zfree(c);return NULL;}......
}// 客户端发送指令后,触发readQueryFromClient Handler,来处理指令
// 处理完后,等待下一个指令

参考资料

  • Event-driven architecture
  • Event-driven architecture
  • Reactor pattern
  • 《Software Architecture Patterns》Mark Richards
  • Event-driven programming
  • Redis源码
  • 《恰如其分的软件架构》

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经尘埃、脑波打字…… 2018年的脑科学要研究什么?

来源&#xff1a;科技日报概要&#xff1a;21世纪是脑科学时代。为了进一步了解大脑&#xff0c;监测大脑活动的研究进行得如火如荼&#xff0c;已在学术界和商业界掀起一股淘金热。人脑可谓人体最复杂、最神秘的器官&#xff0c;无数科学家殚精竭虑&#xff0c;也不过才揭开其…

webapp入门到实战_web前端入门到实战:前端高手在CSS 开发效率的必备片段

这篇文章会记录我们平时常用到的 CSS 片段&#xff0c;使用这些 CSS 可以帮助我们解决许多实际项目问题中遇到的&#xff0c;墙裂建议点赞收藏再看&#xff0c;方便日后查找清除浮动浮动给我们的代码带来的麻烦&#xff0c;想必不需要多说&#xff0c;我们会用很多方式来避免这…

FutureTask 示例

1、简单示例 2、泡茶 1、简单示例 // 创建 FutureTask FutureTask<Integer> futureTask new FutureTask<>(()-> 12); // 创建并启动线程 Thread t1 new Thread(futureTask); t1.start();// 获取计算结果(阻塞主线程&#xff0c;等待结果...) Integer result…

机器学习必知的8大神经网络架构和原理

来源&#xff1a;全球人工智能概要&#xff1a;有些任务直接编码较为复杂&#xff0c;我们不能处理所有的细微之处和简单编码&#xff0c;因此&#xff0c;机器学习很有必要。为什么需要机器学习&#xff1f;有些任务直接编码较为复杂&#xff0c;我们不能处理所有的细微之处和…

《科学》盘点2018可能被聚焦的研究领域

来源&#xff1a;科学网 概要&#xff1a;随着这些大趋势展现出来&#xff0c;《科学》杂志预测了今年可能被聚焦的关于研究和政策的特定领域。动荡的政治变革将在新的一年塑造科学的进程。美国总统唐纳德特朗普领导的政府预计将继续致力于废除基于科学的环境法规。英国离开欧盟…

谷歌大脑2017总结下篇:从医疗、机器人等6个领域开始的改变世界之旅

作者&#xff1a;camel概要&#xff1a;Jeff Dean发表了这篇博文的下篇&#xff0c;内容包括谷歌大脑在 AI 应用方面&#xff08;诸如医疗、机器人、创新、公平和包容等&#xff09;的工作。昨天谷歌大脑&#xff08;Google Brain&#xff09;负责人 Jeff Dean 在 Google Resea…

Gartner:人工智能将改变个人设备领域的游戏规则

来源&#xff1a;人工智能和大数据概要&#xff1a;目前&#xff0c;AI正在产生多种颠覆性力量&#xff0c;重塑我们与个人技术互动的方式。近日&#xff0c;Gartner公司预测&#xff0c;随着情感人工智能&#xff08;AI&#xff09;日臻成熟&#xff0c;个人设备到2022年将比您…

张小龙演讲干货:微信的未来在哪?这里有7个答案

来源&#xff1a;钱塘大数据概要&#xff1a;1月15日&#xff0c;以“to be正当时”为主题的2018微信公开课Pro版在广州举行&#xff0c;腾讯集团高级执行副总裁、微信事业群总裁张小龙出席并发表演讲。1月15日&#xff0c;以“to be正当时”为主题的2018微信公开课Pro版在广州…

敏捷软件开发—原则、模式与实践总结

思维导图&#xff1a;https://www.processon.com/view/link/60d46dfb5653bb049a469068

AWS VS 阿里云 VS 腾讯云 国内三大云服务商云主机评测报告

来源&#xff1a;CloudBest概要&#xff1a;近几年&#xff0c;随着国内公有云市场规模的不断增长&#xff0c;以阿里云、腾讯云为代表的本土云服务商&#xff0c;以及以AWS、微软Azure为代表的海外云服务商&#xff0c;成为公有云市场最大的赢家&#xff0c;市场寡头化趋势已经…

单一职责原则(SRP)

单一职责原则&#xff08;The Single Responsibility Principle&#xff0c;SRP&#xff09; 就一个类而言&#xff0c;应该仅有一个引起它变化的原因。 为何要把两个职责分离到单独的类中&#xff1f; 因为每一个职责都是变化的一个轴线&#xff08;an axis of change&…

多国相继出台政策法规:为「自动驾驶」的「创新发展」保驾护航

来源&#xff1a;腾讯研究院曹建峰 腾讯研究院法律研究中心高级研究员祝林华 腾讯研究院法律研究中心助理研究员人工智能等新技术&#xff0c;正从科幻概念逐步落地到各行各业&#xff0c;将从重塑驾驶、医疗、制造等领域开始&#xff0c;全面重构人类社会和生活。自动驾驶汽…

华为《5G业务商业价值评估》白皮书!

来源&#xff1a;5G蹇飒&#xff1a;华为公司商业与网络咨询部咨询专家。概要&#xff1a;在过去不长的时间里&#xff0c;5G技术不断取得重大进展&#xff0c;5G发展之路更为清晰。未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学…

java正则匹配的坑_java正则表达式入坑指南

在日常开发工作中&#xff0c;无论你使用的语言是java、python、shell、golang还是C#&#xff0c; 正则表达式是编程语言中几乎绕不开的话题。有了它&#xff0c;可以帮你快速定位到符合条件的文本内容。今天小编带大家一起来学习下正则表达式&#xff0c;相信通过这篇文章的介…

这有5种来自大自然「馈赠」的AI技术及其应用,你知道多少?

原文来源&#xff1a;Towards Data Science作者&#xff1a;Luke James「雷克世界」编译&#xff1a;KABUDA对于技术领域中存在的AI相关技术&#xff0c;我们应心存感恩。人类不仅花费了数十年的时间来研究完善数学算法&#xff0c;以使这些奇妙复杂的算法发挥效用&#xff0c;…

物联网定位技术超全解析!定位正在从室外走向室内~

来源&#xff1a;物联网智库概要&#xff1a;GPS和基站定位技术基本满足了用户在室外场景中对位置服务的需求。GPS和基站定位技术基本满足了用户在室外场景中对位置服务的需求。然而&#xff0c;人的一生当中有80%的时间是在室内度过的&#xff0c;个人用户、服务机器人、新型物…

有效的单元测试--总结

思维导图&#xff1a;https://www.processon.com/view/link/60d3072d0791297edd63290a

java原生的ajax怎么写_原生Ajax代码实现

AjaxAsynchronous JavaScript And XML异步&#xff1a;指一段程序执行时不会阻塞其他程序执行&#xff0c;其表现形式为程序的执行顺序不依赖程序本身的书写顺序 &#xff0c;相反的则为同步&#xff0c;自己理解的就是类似百度的搜索框输入内容时的提示相关的内容功能&#xf…

人工智能阅读理解是如何打破人类记录? 解读阿里iDST SLQA 技术

来源&#xff1a;网络大数据概要&#xff1a;微软和阿里巴巴开发的人工智能在斯坦福阅读理解测试中并列第一&#xff0c;在答案的精确匹配度上比人类高出几个基点。微软和阿里巴巴开发的人工智能在斯坦福阅读理解测试中并列第一&#xff0c;在答案的精确匹配度上比人类高出几个…

Java测试驱动开发--总结

思维导图&#xff1a;https://www.processon.com/view/link/60d307415653bb049a437111