基于SEDA的异步框架设计与实现
三、异步框架技术选型
在这次实现的SEDA异步框架中,采用的基础架构原型如下:
采用了spring+quartz+fastjson+rabbitmq来实现。和传统SEDA架构区别比较大的地方在于:
1、采用分布式mq(使用了rabbitmq)而不是blockingqueue。如此既可以支持以后可能进行的分布式化扩展,也可以使得框架具有高可用性,在大数据处理的时候仍可具有较为客观的性能。同时,消息的传递过程中,采用了高性能的fastjson进行数据序列化和反序列化。使得数据在stage之间的传递速度更快。
2、除了分布式mq之外,还提供了本地动态线程池所需要的队列。避免了consumer由于长时间处理导致数据在队列中积压。
3、stage利用quartz来提供定时功能,使得stage中的work可以选择定时/实时进行数据处理。从而迎合更多不同类型的需求。(比如定时报警,定时分析监控数据)
1、spring
spring无需再赘述,使用其IOC、AOP等功能,并同时使用spring的其他组件比如spring-rabbit、spring-quartz等。保证spring各包兼容即可。
2、quartz
quartz 的介绍文档网上很多,quartz作为一款优秀的定时器框架可以和spring无缝结合,同时还具有java自带的定时器timer所不具备的定时启动的 功能。其类crontab风格的定时任务声明也更符合我们企业级应用过程中的书写风格。之前文章中介绍过使用quartz过程中需要关注的几个点,复述如 下:
1)Job不能为内部类,否则无法初始化
2)保证spring升级到新版本。如果使用老版本比如3.0.5,则会出现如下异常:
java.lang.IncompatibleClassChangeError: Found interface org.quartz.JobExecutionContext, but class was expected
该case在http://code.google.com/p/wisematches/issues/detail?id=156上有记录。
3)引入spring-context-support包来使用quartz相关内容,并保证与其他包的兼容性。
4)其定时语法和crontab有些许差别。语法见:
http://www.blogjava.net/javainthink/archive/2006/10/19/76077.html
在异步框架中的使用场景:辅助实现定时功能,从而使得异步框架可以更加灵活的支持各种需求。
4、rabbitmq
stage与stage之间需要依靠事件队列来进行通信,如果依赖于SEDA官网推荐的BlockingQueue,则无法满足未来的分布式部署。所以决定采用分布式mq来实现。以下比较几个主流的消息中间件:
1) activemq:
被称为消息中间件中的瑞士军刀。支持JMS,性能不错。开源社区活跃。能与java很好结合。Spring有相应lib。其功能较为完备,可支持P2P和代理,但性能逊于rabbitmq。从性能角度出发来考虑,决定不使用activemq。
2)zeromq
性能比其他中间件优异得多。但无法持久化,不能保证数据的可靠性。由于数据的可靠性不能被保证,所以暂时也不考虑。
3)redis 可以当作轻量级的中间件。当传输数据大小少于10k时入队性能优异,数据较大时性能急剧下降。而其出队性能不论数据量大小都十分优秀。考虑到项目实现过程 中可能出现的大于10K的请求响应事件数据(比如推荐关键词、比如与后端服务交互返回的数据),所以不采用redis。
4)kafka
除此之外,kafka也是一款值得注目的,性能优异的分布式消息中间件,通过producer的push和consumer的poll来实现数据的交互。 kafka自带负载均衡、并有高可用、高吞吐等特性。但是考虑到实际项目的适用情况,暂时还不需要zookeeper集群,broker集群来进行如此大 规模的数据处理。加上其依赖于scala环境,所以要部署和运维显得不那么方便。所以暂时不考虑。
5)rabbitmq
支持AMQP,性能优于activemq。能与java很好结合。Spring有相应lib。环境部署起来不如activemq便捷,需要erlang环境。
在http://www.aqee.net/message-queue-shootout/一文中对activemq和rabbitmq进行的性能比较显示出rabbitmq更佳的性能。如下图所示:
综上所述,考虑到该次项目所应用的场景和处理数据量的规模,且需要较为优秀的性能,较为便捷的部署方式,能保证消息可靠性以及可持久化,并且对java友好。最终权衡之下,选择了基于AMPQ的rabbitmq消息中间件。
- 大小: 20.6 KB
分享到:
相关推荐
**基于SEDA的异步框架设计与实现** SEDA(Staged Event-Driven Architecture)是一种软件架构模式,常用于高性能、高并发的应用程序设计。它将系统分解为多个独立的阶段,每个阶段处理特定类型的事件,并通过队列...
#### 三、SEDA模型应用于ESB的设计 ##### 3.1 需求分析 在高并发环境下,ESB的主要挑战包括: - **性能瓶颈**:传统的ESB可能无法处理大量的服务请求,导致响应时间增加。 - **资源利用效率**:如何有效地分配和...
SEDA(Staged Event Driven Architecture,分阶段事件驱动架构)是一种有效的方法,它通过非阻塞、异步化和队列的策略来提高系统的性能和稳定性。本篇将深入探讨SEDA的原理和应用,以及如何结合实际经验来优化服务端...
这种架构模式在处理大规模并发请求时表现优异,因为它能够通过异步处理和资源隔离来提高系统的可扩展性。 1. **事件驱动** SEDA架构的核心是事件驱动。在系统中,各种操作被封装成事件,由事件生产者产生,然后...
**SEDA(Staged Event Driven Architecture)**是一种在高性能计算和互联网服务中广泛应用的架构模型,由加州大学伯克利分校的研究团队提出。它的核心思想是将复杂的系统分解为一系列独立的、有序的处理阶段,每个...
### 基于SEDA的企业服务总线的设计与实现 #### 概述 本文主要探讨了如何通过...未来的研究可以进一步探索SEDA模型在其他领域的应用潜力,以及如何结合最新的云计算技术和大数据处理框架来进一步提升ESB的性能和功能。
**SEDA(Staged Event Driven Architecture)框架详解** SEDA,全称为Staged Event Driven Architecture,是一种在高性能计算领域被广泛采用的软件架构模式,最初由加州大学伯克利分校的研究团队提出。该架构设计的...
3. 支持任何传输之上的异步、同步和请求响应事件处理机制。 4. 支持 Axis 或者 Glue 的 Web Service。 5. 灵活的部署结构 [Topologies],包括 Client/Server、P2P、ESB 和 Enterprise Service Network。 6. 与 ...
3.支持任何传输之上的异步,同步和请求响应事件处理机制. 4.支持Axis或者Glue的Web Service. 5.灵活的部署结构[Topologies]包括Client/Server, P2P, ESB 和Enterprise Service Network. 6.与Spring 框架集成:可...
SEDA的架构设计将服务容器分解为多个阶段,每个阶段处理不同的事件,并通过异步通信机制实现非阻塞I/O操作,这有助于系统性能的提升和可伸缩性的增加。 网格服务容器是服务网格中的一个基础组件,负责屏蔽资源异构...
2. **异步和同步事件处理**:支持异步、同步和请求响应的事件处理机制,增强了系统的响应性和效率。 3. **WebService支持**:兼容Axis或Glue的WebService,简化了Web服务的集成与开发。 4. **灵活的部署结构**:...
Netty是一个高性能、异步事件驱动的网络应用程序框架,适用于快速开发可维护的高性能协议服务器与客户端。该框架利用Java NIO来实现Reactor模式,这种模式通过同步等待多个I/O事件的发生,然后通过多路复用机制将...
通过以上内容,我们可以理解“seda过载保护”不仅仅是一个技术问题,而是一个涉及到系统设计、资源管理和互联网服务鲁棒性的整体问题。在未来的互联网服务和分布式系统设计中,如何合理地引入和管理过载保护机制将...
唤醒Wake是一个事件驱动的框架,基于SEDA,Click,Akka和Rx的思想。 从某种意义上说,它是通用的,旨在支持计算密集型应用程序以及高性能网络,存储和旧版I / O系统。 我们实现了Wake以支持高性能,可扩展的分析处理...
【标题】:“2017-11-07 Seda 安装配置笔记1”描述了一次在Ubuntu 14.04环境下对Seda软件的安装与配置过程,涉及了VMware虚拟机、依赖软件的安装、LLVM与Clang的编译以及Seda的编译和配置。 【描述】:首先,安装...