博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Staged Event-Driven Architecture
阅读量:5821 次
发布时间:2019-06-18

本文共 1449 字,大约阅读时间需要 4 分钟。

SEDA的是上演事件驱动架构的缩写,一个复杂的,事件驱动的应用程序分解成一组队列连接的阶段 。 这种设计避免了与基于线程的并发模型相关的开销,并分离事件和应用程序逻辑线程调度。 通过执行每个事件队列入场控制,服务以及空调加载,防止资源被过度,当需求超过服务能力。  SEDA的采用动态控制,自动调节运行参数(如每个阶段的调度参数),以及管理负载,例如执行自适应负载脱落。 分解成一阶段的服务,也使复杂的事件驱动应用程序的模块化和代码重用,以及调试工具的发展。

对于服务端端处理模型,目前广泛使用的有两种:

1、多线程处理模型。这种模型由一个主线程和多个work线程构成,主线程负责接收请求,并将接收到的请求分发给合适的work线程处理,work线程处理完请求后直接将响应返回给客户端。这种模型很简单,也有着广泛的应用,尤其是通常的后端模块,处理逻辑在work线程里是阻塞进行的。这个模型的 缺点也很明显,如果大量的work线程因为某种原因被堵住(比如连接的DB响应太慢、从磁盘获取文件数据等),将使得后续的请求得不到处理,而最经典的例 子莫不过apache了。

2、事件驱动(Event-Driven)处理模型。这种模型克服了多线程模型的并发量缺点,对请求采用事件驱动方式处理,这里的事件通常是IO事 件,其底层的实现依赖于非阻塞IO和IO多路复用。事件驱动模型很适合于IO密集型的应用,这种应用对CPU消耗代价甚至要小于线程间的切换代价,比如各 种proxy。而现在的proxy,基本都标配Epoll,使得能支持的并发请求数在万级别。像lightty、nginx,是事件驱动模型的经典应用, 请求的处理流程是由状态机驱动的,每次状态的切换经由一次事件触发,这样单线程就够用了(当然,如果需要支持更高的处理能力,可以采用多进程的事件驱动模 型)。事件驱动的缺点在于:1)单个处理阶段不能阻塞太长,如果有这方面的问题,一般可采用专门的线程处理,处理完了再触发事件让主线程接着处理。2)整 个事件驱动流程通常是固定的,在一个线程内由调度器完成,这使得它很难做的通用,使应用可以自定义流程。

基于上面提到的两种模型的优缺点,SEDA被提出来,它的核心思路是:一个请求被分成多个stage进行处理,每个stage彼此间独立,一个请求 的多个stage可以串行化也可以并行化。stage内部使用Event-Driven,新到的请求放到event queue中,系统从thread  pool中的选择一个线程经由Event Handler处理,Event  Handler处理完后将请求派发到下一个stage。

1)输入的event queue。SEDA中的event queue的大小是有限制的。所以,如果event queue 达到阈值,新到的event可能会被拒绝或者转发到特定的stage(比如错误处理stage)。

2)thread pool:这个线程池对应用是透明的,并且每个stage的线程池是彼此独立的。针对请求量及特点,线程池可以动态的调整大小,不至于某个stage的线程池耗尽所有的资源。

3)event handler,event handler接收系统给予的event,做具体的逻辑处理后将event分发到其他stage。event handler通常需要应用开发者编写。

 

转载于:https://www.cnblogs.com/java-zone/articles/2524664.html

你可能感兴趣的文章
敲山震虎?继MongoDB之后,AWS又对Elasticsearch下手了
查看>>
Kubernetes 1.14重磅来袭,多项关键特性生产可用
查看>>
回到网易后开源APM技术选型与实战
查看>>
前端tree优化实践:渲染速度从14.65s到0.49s
查看>>
又拍云刘平阳,理性竞争下的技术品牌提升之道
查看>>
又拍云引领云CDN加速 或成互联网刚性需求
查看>>
阿里巴巴和京东进军美国电商界,分别针对企业用户和普通用户
查看>>
RCurl并行发送多个请求导致内存增长的解决方法
查看>>
让webpack2兼容IE8以下代码
查看>>
非对称加密
查看>>
国内首例:飞步无人卡车携手中国邮政、德邦投入日常运营
查看>>
微软Office 365正式上架Mac App Store
查看>>
IBM中国开发中心吉燕勇: 通过Cloud Data Services打造新型认知计算数据分析云平台...
查看>>
Visual Studio交叉编译器提供对ARM的支持
查看>>
DAGOR:微信微服务过载控制系统
查看>>
PayPal Agility with Stability On OpenStack
查看>>
ArchSummit深圳APM专场总结:性能监控与调优实践干货分享
查看>>
yaml转java bean
查看>>
通过Visual Studio为Linux编写C++代码
查看>>
Elixir 初尝试 1 -- 这里的等号不一样 & 不变的数据
查看>>