SEDA架构实现
一、SEDA

SEDA全称是:stage event driver architecture,中文直译为“分阶段的事件驱动架构”,它旨在结合事件驱动和多线程模式两者的优点,从而做到易扩展,解耦合,高并发。
各个stage之间的通信由event来传递,event的处理由stage的线程池异步处理。
上图对SEDA做了一点改动,如图所示,每个stage由几个核心部分组成:
1)阶段控制器:StageController
2) 事件队列:eventQueue
3) 事件监听器
4)事件处理线程池(线程池内部维护一个队列)
5)事件处理器(事件处理器图上没显示,作为一个业务线程来实现)
处理流程如下:
1)event推送到stage的eventQueue
2) EventListener监听到了event
3)ThreadPool异步并发处理event
二、UML类图
依据上图的逻辑,下面是UML类图设计
1) StageManager初始化调用boot(),创建Stage并维护Event和Stage之间的映射关系
2)Stage启动监听器,监听事件队列(事件队列可以是本地,也可以是分布式队列,这里采用一个Builder构造器了来实现,你可以在构造器里面实现自己的策略)
3)如果接收到事件,将提交给执行器去执行(这里涉及到事件处理器,包含业务逻辑)

三、PDM
下面设计了两张表:
1)t_stage_event:针对每个Stage的事件进行持久化,防止事件丢失补偿处理
2)t_stage_event_log: 对一个event做链路跟踪的日志表

SEDA架构实现的更多相关文章
- 高并发服务器架构--SEDA架构分析
纯粹转发,没有深入研究,转自:SEDA架构笔记 百牛信息技术bainiu.ltd整理发布于博客园 一.传统并发模型的缺点 基于线程的并发 特点:每任务一线程直线式的编程使用资源昂高,context切 ...
- SEDA架构程序实现
一.SEDA SEDA全称是:stage event driver architecture,中文直译为“分阶段的事件驱动架构”,它旨在结合事件驱动和多线程模式两者的优点,从而做到易扩展,解耦合,高并 ...
- SEDA 架构
参考文档: https://blog.csdn.net/zhihui1017/article/details/50502825
- 基于SEDA的异步框架设计与实现
基于SEDA的异步框架设计与实现 二.为什么使用SEDA 目前,面对并发环境,主流互联网服务器编程模型有两种:多线程模型以及事件驱动模型.但是这两个模型都不足以解决这个问题.我们来首先看一下这两种编程 ...
- 浅谈线程池(中):独立线程池的作用及IO线程池
原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...
- Android基于基于布局嵌套的页面导航实现
页面如下: 主页面的布局分隔为三部分: 注意观察上面标记为红色的android:id均采用android系统默认的名称: 页面的导航组件: <?xml version="1.0&quo ...
- cassandra 并发技术介绍
摘要 本文主要介绍cassandra线程技术,cassandra的实现是基于java的,所以线程技术使用的也是jdk包提供的线程类.cassandra是分布式数据库,整个并发架构是基于阶段事件驱动架构 ...
- mina写入数据的过程
mina架构图 写数据.读数据触发点: 写数据: 1.写操作很简单,是调用session的write方法,进行写数据的,写数据的最终结果保存在一个缓存队列里面,等待发送,并把当前session放入f ...
- 深入浅出聊聊企业级API网关
http://architect.dataguru.cn/article-11431-1.html API Gateway(API GW / API 网关),顾名思义,是出现在系统边界上的一个面向 A ...
随机推荐
- WordPress固定链接后404的解决方法
一般Wordpress自带的链接是一大串数字加符号,不美观也不明确,一般要设置成固定链接,而设置成功后大部分情况访问文章,子链接都会出现404界面,我找了网上的资料,才知道需要配置伪静态链接, 一般的 ...
- Java对象与类—对象与类
1.类 类(class)是构造对象的模板,具体点说类就是对具有相同性质,相同行为的一群对象的抽象说明.由类构造(construst)对象的过程称为创建类的实例(instance). 2.对象 对象是类 ...
- docker找回构建时被删除的文件
设想这样一个场景:当一个docker镜像被多次引用构建,在某次构建中某个文件被删除,如何找回被删除的文件? 要想回答这么一个问题,首先得熟悉下docker镜像的分层存储结构,镜像每一层都是只读的: 那 ...
- Linux中C++提示‘close’ was not declared
C++socket编程时关闭socket和epoll时出现‘close’ was not declared,是程序头文件缺失导致的.缺失头文件#include <unistd.h>
- C#LeetCode刷题之#680-验证回文字符串 Ⅱ(Valid Palindrome II)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3961 访问. 给定一个非空字符串 s,最多删除一个字符.判断是否 ...
- C#LeetCode刷题之#88-合并两个有序数组(Merge Sorted Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3686 访问. 给定两个有序整数数组 nums1 和 nums2, ...
- Eclipse怎么调整字体大小和主题
调整字体 哈哈哈哈哈 ( ̄▽ ̄),直接Ctrl + -/+号,....在英文输入法状态. 或者,你想更细致的调整字体类型,可以在Winodw -> Preferences中调整: 换主题 你可以 ...
- Kubernetes基于haproxy实现ingress服务暴露
HAproxy Ingress控制器 HAproxy Ingress简介 HAProxy Ingress watches in the k8s cluster and how it builds HA ...
- Mybatis中List传值
Mybatis遇到List传值时常用方法. 1. List<E>,E为基本数据类型和String Mapper类文件: List<User> selectByIds(List& ...
- PythonCrashCourse 第八章习题
编写一个名为display_message() 的函数,它打印一个句子,指出你在本章学的是什么.调用这个函数,确认显示的消息正确无误 def display_message(): print(&quo ...