`
iunknown
  • 浏览: 409320 次
社区版块
存档分类
最新评论

half-sync/half-async,SEDA 和 生产者/消费者

阅读更多
在这里看到关于 Mina based SMTP handler 的讨论,里面提到 mina 是 SEDA 的一个实现。

mina and SEDA

It uses non-blocking IO and is an implementation of the staged
event driven architecture (SEDA).  SEDA makes it possible to have
thousands of concurrent network connections.


看到之后,忽然想到,half-sync/half-async 模式其实也可以看成是 SEDA 的一个实现。SEDA 是一个更抽象、更全面的描述,而 half-sync/half-async 模式可以看成是 SEDA 的一个具体的,更有针对性的实现。

SEDA 的论文里有以下这样的描述,这个正是典型的 half-sync/half-async 要解决的问题。

First, the use of threads relaxes the constraint that all event-processing code be non-blocking, allowing an event handler to block or be preempted if necessary. In a traditional event-driven system, all blocking operations must explicitly capture the state of the computation and restore it when the operation completes. In SEDA, threads act as implicit continuations, automatically capturing the execution state across blocking operations.

half-sync/half-async 模式中的层就相当于 SEDA 中的 stag。在 half-sync/half-async 模式中,有一个异步层和同步层;而在 SEDA 中,可以有任意多的 stage,每个 stage 可以是同步的,也可以是异步的。所以可以认为 half-sync/half-async 是 SEDA 的一种简化后的实现。

half-sync/half-async 模式也可以从 生产者/消费者 的角度来描述。
spserver 中,同步层和异步层轮流扮演这两个角色。
异步层从 socket 读入数据,然后放到同步层的队列中,这个时候异步层是生产者,同步层是消费者。同步层处理完之后,把输出数据放到异步层的队列中,这个时候同步层是生产者,异步层是消费者。
分享到:
评论
4 楼 iunknown 2007-05-21  
引用
将要阻塞的接口调用,封装到一个Task里面,然后扔到线程池执行. 在接口调用后,会执行一个callback来继续之前的流程.


这种做法本质上和 SEDA 并没有不同,不同的只是 SEDA 或者 half-sync/half-async 把这种做法做了一个规范化的设计,规定了不同的层之间是怎么通信的,并且做了一部分的封装,以方便使用。a
3 楼 Arbow 2007-05-21  
受教了:)
在我的Server开发项目里面,我是将要阻塞的接口调用,封装到一个Task里面,然后扔到线程池执行. 在接口调用后,会执行一个callback来继续之前的流程.
这样做,现在感觉更为复杂,相比seda并不直观。
2 楼 iunknown 2007-05-21  
用“应用为主”和“性能为主”来分类并不合理。“应用”和“性能”在这里并没有明确地定义。

对于 memcached,haproxy 这类应用程序,除了在 SocketIO 之外,其他的处理逻辑一般都是纯计算的(在 memcached 中主要是内存池的分配,hash 表的维护)。即从理论上来说,只有在 SocketIO 这一个点上会造成阻塞。因此只要针对 SocketIO 使用 non-blocking 的选项就可以使用 single-thread event-driven 这种实现方式了。

引用
In a traditional event-driven system, all blocking operations must explicitly capture the state of the computation and restore it when the operation completes.


但是并不是所有的要求高性能的应用程序都只在 SocketIO 这一个点上会造成阻塞。比如在一个典型的 MTA (Mail Transfer Agent) 中,通常需要支持 SMTP AUTH 命令。SMTP AUTH 的时候需要做数据库的查询。这个时候就比较难把这个操作转化为 non-blocking 的形式。一是因为几乎所有的数据库提供的 client api 都是 block 形式的;其次,即使有 non-blocking 形式的数据库 api ,也可以想像到这种 api 将会难于使用。

因此对于是否使用多线程,关键点在于是否有一些操作是 block 的,并且难于把这些 block 的操作转化为 non-blocking 的操作。如果是,那么就可以使用多线程来降低编程的难度。
1 楼 Arbow 2007-05-21  
对于SEDA这种模型,从性能上,会存在着大量线程切换开销,以及队列读写的锁开销。一些号称高性能的程序,比如memached,haproxy,都是使用单线程的event driven,在一个循环中处理网络分发和定时器事件等。
是否只应该在一些以应用为主的server上使用seda,充分发挥多线程多核的优势,而性能为主的应用,比如proxy,还应该使用单线程事件取得模型呢?

相关推荐

    Half Sync/Half Async Pattern

    ### 半同步/半异步模式 (Half Sync/Half Async Pattern) #### 概述 半同步/半异步(Half Sync/Half Async, HS-HA)架构模式是一种用于复杂并发系统的设计模式,它通过将同步任务与异步任务解耦来优化系统的性能...

    前端开源库-babel-helper-remap-koa2-async-to-generator

    前端开源库-babel-helper-remap-koa2-async-to-generatorbabel-helper-remap-koa2-async-to-generator,将异步函数转换为ES2015生成器(koav2->koav1)。

    vuex-iframe-sync-iframe /窗口之间的Vuex状态同步。-Vue.js开发

    vuex-iframe-sync英文| 中文iframe /窗口之间的Vuex状态同步您的明星是对我的最大鼓励。 :sparkles:功能:支持ifra vuex-iframe-sync英文| 中文iframe /窗口之间的Vuex状态同步您的明星是对我的最大鼓励。 :sparkles...

    Android代码-android-async-http

    ...Changelog See what is new in ...https://github.com/loopj/android-async-http/blob/1.4.9/CHANGELOG.md Javadoc Latest Javadoc for 1.4.9 release are available here (also included in Maven repository): ...

    android-async-http 源码

    Build Status ...https://github.com/loopj/android-async-http/blob/1.4.9/CHANGELOG.md Javadoc Latest Javadoc for 1.4.9 release are available here (also included in Maven repository): ...

    论文研究-自主虚拟士兵攻击行为研究.pdf

    为了降低线程完成的超时发生率,采用Half-Sync/Half-Async线程池架构建立实时控制系统的线程池,利用最小二乘支持向量回归机(LSSVR)对线程执行时间进行预测估计,再基于估计结果对线程池线程的分配调度优先级别...

    安装python3-aptdaemon所需要的python文件client.py

    安装python3-aptdaemon所需要的python文件,然而,自动生成的可能在新版python中运行,需要替换。位置/usr/lib/python3/dist-packages/aptdaemon/client.py

    前端开源库-sync

    为了解决这个问题,出现了Promise、async/await等解决方案,而“前端开源库-sync”则是另辟蹊径,采用了Fibers技术。 Fibers是Node.js的一个扩展,它允许开发者在单线程环境中创建并控制多个执行上下文,每个上下文...

    konserve, 带有 core.async的clojuresque key-value/文档存储协议.zip

    konserve, 带有 core.async的clojuresque key-value/文档存储协议 konserve 的... 使用 core.async 语义定义的简单文档存储协议,允许在关联 key-value 存储上使用来自Clojure和ClojureScript的Clojuresque Collectio

    laravel-5-sockets-and-queue-async, Laravel 5 web socket和带有套接字警报回调的队列异步.zip

    laravel-5-sockets-and-queue-async, Laravel 5 web socket和带有套接字警报回调的队列异步 Laravel 5,带有 web sockets和队列异步安装干净的Laravel 5composer create-project laravel/laravel --prefer-dist/path...

    前端开源库-babel-plugin-transform-async-to-promises

    3. **转换过程**:`babel-plugin-transform-async-to-promises`工作原理是,首先识别出`async function`和`await`关键字,然后将它们替换为基于Promise的操作,如`.then()`和`.catch()`。这样,即使目标环境不支持`...

    mongodb-async-driver-2.0.1驱动.zip

    mongodb-async-driver-2.0.1驱动文件 jar MongoDB Async Java Driver Documentation Welcome to the MongoDB Async Java driver documentation hub. Getting Started The Getting Started guide contains ...

    hostapd+ssl+libnl.rar

    ./config no-asm shared no-async --prefix=/usr/local/aarch64-linux-gnu-7.4.1/aarch64-linux-gnu --cross-compile-prefix=aarch64-linux-gnu- hostpad 移植 cp defconfig .config vi .config CONFIG_LIBNL32...

    baserver服务器框架C++ Tcp server

    bas为boost_asio_server(baserver)的简称,是采用Half-Sync/Half-Async模式的服务器框架,使用c++实现,能够大大简化tcp server的开发工作。bas目前实现了以下功能: 1、底层基于boost及asio实现,支持ssl,跨越...

    mongodb-async-driver-2.0.1 jar包

    总的来说,"mongodb-async-driver-2.0.1.jar"这个包是Java开发者与MongoDB数据库交互的强大工具,它通过异步I/O和事件驱动的编程模型,提高了应用的并发能力和响应速度。通过这个驱动,开发者可以充分利用MongoDB的...

    async-http-client-1.9.40.jar

    今天再找一个jar包,可是在网上找的都需要...(async-http-client-1.9.40.jar) maven: <groupId>com.ning</groupId> <artifactId>async-http-client</artifactId> <version>1.9.40</version> </dependency>

    async-mysql-connector-1.6.jar

    async-mysql-connector-1.6.jar async-mysql-connector-1.6.jar async-mysql-connector-1.6.jar async-mysql-connector-1.6.jar async-mysql-connector-1.6.jar async-mysql-connector-1.6.jar async-mysql-...

    关于禁用weblogic wls-wsat组件的步骤说明

    - 生产环境核心业务测试无异常。 #### 三、禁用步骤详解 禁用WLS-WSAT组件的操作分为两大类:非NodeManager模式和NodeManager模式。每种模式下又有两种不同的禁用方法。 ##### 1. 非NodeManager模式 **方法一:...

    SpringMVC文件上传

    11:01:33,545 DEBUG ThreadPoolAsynchronousRunner:730 - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@5b28c08e -- Running DeadlockDetector[Exiting. No pending tasks.] 11:01:43,558 ...

    前端开源库-babel-plugin-transform-async-to-generator-2

    前端开源库-babel-plugin-transform-async-to-generator-2babel-plugin-transform-async-to-generator-2是babel-plugin-transform-async到generator的一个分支,与此插件保持异步函数的原始参数名略有不同。

Global site tag (gtag.js) - Google Analytics