用于大型事件处理的Akka Java

我们正在设计一个大型的分布式事件驱动系统,用于跨事务数据库的实时数据复制。 来自源系统的数据(消息)在到达目的地之前经历了一系列转换和路由逻辑。 这些转换是多进程和多线程的操作,包括可以同时执行的较小的无状态步骤和任务。 相反,没有跨进程的共享状态,状态转换保留在数据库中,每个进程都直接从数据库中提取其工作队列。

基于此,我们需要一种在Java + Spring平台上支持分布式事件处理,路由和并发的技术,其中考虑的三个选项是MessageBroker(RabbitMQ),Spring Integration和Akka。

RabitMQ: MQ是首选,因为它是消息传递/事件处理的传统且经过验证的解决方案。 RabbitMQ,因为它是流行的轻量级开源选项,并获得了我们已经使用过的供应商的商业支持。 RabbitMQ给我留下了深刻的印象,它易于使用,精简但仍支持高级分发和消息传递功能。 它对我们而言唯一缺少的是在Oracle中保留消息的能力。

即使RabbitMQ是开放源代码(免费),但对于企业而言,它还是有相当大的成本因素。 由于MQ是中间件堆栈中的一个附加组件,因此它需要专门的人员来进行管理和维护以及产品的商业支持。 同样,MesageBroker的设置和配置也有其自身的复杂性,并且涉及跨团队的协调。

MQ主要是EAI产品,并提供跨平台(多语言,多协议)支持。 当仅用作异步并发和并行解决方案时,它们可能会过于庞大和昂贵。

Spring集成: Spring有一些模块可提供可扩展的异步执行。 Spring TaskExecutor通过轻量级线程池选项提供异步处理。 Spring Batch允许通过Job Launcher和Job Repository进行分布式异步处理。 Spring Integration通过提供EAI功能,消息传递,路由和中介功能进一步扩展了它。

尽管所有三个Spring模块都具有某些必需的功能,但很难将所有内容组合在一起。 像这个用户一样,我期望Spring Integration将具有类似RMI的远程处理功能。

Akka Java: Akka是一个工具箱和运行时,用于在JVM上构建高度并发,分布式和容错的事件驱动的应用程序。 它具有Java API,因此我决定尝试一下。

Akka很容易上手,我发现Activator很有帮助。 Akka基于Actor模型,该模型是在没有共享对象和阻塞的情况下实现并发的消息传递范例。 在Akka中,不是直接调用对象,而是构造了一条消息,并通过actor引用将其发送到该对象(称为actor )。 这种设计大大简化了
并发管理。

但是,简单性并不意味着可以在不更改代码的情况下将传统的基于锁的并发程序(线程/同步)转换为Akka。 人们需要通过定义较小的任务,消息和它们之间的通信来设计其Actor系统。 Akka的概念和Actor Model范例有一个学习曲线。 考虑到并发和并行性的复杂性,它相对较小。

Akka提供了正确的抽象级别,您不必担心共享状态的线程和同步,但是您具有完全的灵活性和控制权来编写自定义并发解决方案。

除了简单性,我还认为Akka的真正功能是远程处理及其将角色分布在多个节点上以实现高可伸缩性的能力。 Akka的位置透明性和容错性使扩展和分发应用程序变得容易,而无需更改代码。

我能够轻松地为我的多进程和多线程用例构建一个PoC。 我仍然需要解决Actor中的Spring注入问题。

请注意,由于Scala的类型系统,Akka的Java代码具有大量的类型转换,因此实现对象可变性可能很棘手。 我很想将现有的JPA实体(可变)重用为消息,以减少数据库调用。

此外,Akka社区面向Scala,并且Akka Java上的资料较少。

尽管如此,Akka Java在这三种中似乎是更便宜,更快和更高效的选择。

翻译自: https://www.javacodegeeks.com/2014/05/akka-java-for-large-scale-event-processing.html

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

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

相关文章

pygame-KidsCanCode系列jumpy-part8-记录历史最高分

通常在多玩家的游戏中,每个玩家都会有自己的得分,最高分数会成为该游戏的最佳记录。这一篇,学习下如何记录最高得分:(为了简化代码,本文采用文件方式,仅记录本机得分,明白原理后&…

linux下查看进度命令,在Linux系统中使用Coreutils Viewer显示命令运行进度

Coreutils Viewer(cv)是一个简单的程序,它可以用于显示任何核心组件命令(如:cp、mv、dd、tar、gzip、gunzip、cat、grep、fgrep、egrep、cut、sort、xz、exiting)的进度。它使用文件描述信息来确定一个命令的进度,比如cp命令。cv之美在于&…

每个Java开发人员都应该阅读的10本书

我已经阅读了自己的软件开发书籍,并且发现发现一本我想多次阅读的书籍非常罕见。 但是,有时我会发现一本书,每次阅读时都会教给我新的东西。 这篇博客文章是对这些稀有宝石的致敬。 现在,我毫不犹豫地向您介绍十本书&#xff0c…

存储过程生成流水号

1,首先在数据库中创建一个存放流水号的表 CREATE TABLE [dbo].[NumSeq] ([Cate] [varchar] (2) NOT NULL ,[DateNo] [varchar] (4) NOT NULL ,[Seq] [int] NULL ,[CrTime] [datetime] NOT NULL ) 上面的代码中,Cate 字段为流水号的头,可以…

tennylvHTML5实现屏幕手势解锁(转载)

来源:https://github.com/lvming6816077/H5lockhttp://threejs.org/examples/http://www.inf.usi.ch/phd/wettel/codecity-download.html (JSCity:把源码可视化成建筑物的 JS 库)http://www.alloyteam.com/2015/07/html5-shi-xian-ping-mu-shou-shi-jie-suo/ (Web前…

Linux中mysql的卸载和重装,linux mysql 卸载后重装

$sudo apt-get remove mysql-common清理残留数据:$sudo dpkg -l |grep ^rc|awk {print $2} |sudo xargs dpkg -P按照正常安装步骤安装注意:如果你想进行远程访问或控制,那么你要做两件事:其一:mysql>GRANT ALL PRIVILEGES ON xoops.* TO x…

NOIP模拟赛(by hzwer) T3 小奇回地球

【题目背景】 开学了,小奇在回地球的路上,遇到了一个棘手的问题。 【问题描述】 简单来说,它要从标号为 1 的星球到标号为 n 的星球,某一些星球之间有航线。 由于超时空隧道的存在,从一个星球到另一个星球时间可能会倒…

oracle 执行多条insert 语句

其实这是一个sqlserver的脚本改的。用脚本的原因是:当时我的oracle不能导入execl,也不能从别的数据库直接导入,最后就用脚本了。 insert all INTO TestA (ID, tbname, colname, coltxt, collen, coltype, coloper, colcontent) VALUES(1, A主表, ZHD0A00…

JUnit ExpectedException规则:超越基础

JUnit测试中有多种处理异常的方法。 正如我在以前的一篇文章中所写的那样 ,我最好的方法是使用org.junit.rules.ExpectedException规则。 基本上,规则是用org.junit.Before , org.junit.After , org.junit.BeforeClass或org.junit…

sql 基本操作

数据库表的操作 SQL code ------------------------------列操作-------------------------------------添加列ALTERTABLEt ADDMycolumn intidentity(1,1)||notnulldefault(0) --删除列altertablet dropcolumnMycolumn --修改列altertablet altercolumnMycolumn varchar(20) no…

[EffectiveC++]item34:区分接口继承和实现继承

[EffectiveC]item34:区分接口继承和实现继承 转载于:https://www.cnblogs.com/jeanschen/p/3363569.html

web 上传文件到linux没权限,Javaweb上传文件到Linux 没有读写权限

一、 问题描述背景描述:0.saas-business-运营后台,website-网站页面。1.javaweb程序(saas-business)部署在linux系统 tomcat服务器下,使用该程序里面上传图片功能,上传图片至linux服务器挂载盘(共享盘)中/nfs/uploads/目录下。tom…

2008Beta 版AJAX的一个奇怪的问题

最近在用ASP.NET做一个MIS系统,为了使页面有比较好的效果,减少刷新,用了AJAX控件,比如日历,水印等。 最主要的是用它来实现几个DropDownList控件之间的联动。起初问题是当也面加载时…

如何将IntelliJ项目添加到GitHub

尽管GitHub文档包含有关如何将现有GitHub项目添加到本地计算机的好信息,但是我对如何将本地计算机上的现有(未版本化)项目添加到GitHub的了解还很少。 这是我使用的步骤。 从IntelliJ 选择“ VCS”菜单->在版本控制中导入->在GitHub上…

REST-framework快速构建API--四部曲

代码目录结构: 一、使用原生APIView 使用rest-framework原生的APIView实现过程: 以url(r^books/$, views.BookView.as_view(),name"books")为例进行流程分析, 1、views.BookView.as_view()>APIView的as_view方法>父类【View】…

aix内核是linux,查看Linux及AIX硬件信息方法总结

一. CPU信息1. AIX1.查看CPU核心数:# pmcycles -m# pmcycles -mCpu 0 runs at 1900 MHzCpu 1 runs at 1900 MHzCpu 2 runs at 1900 MHzCpu 3 runs at 1900 MHz2.查看逻辑CPU个数# bindprocessor -q# bindprocessor -qThe available processors are: 0 1 2 33.查看CP…

Tomcat-部署多个项目(不同端口)

20190713 整理 参考文档 https://blog.csdn.net/chenchunlin526/article/details/78799772 如何在Tomcat服务中,为不同端口部署不同项目? https://jingyan.baidu.com/article/2f9b480ddda95e41cb6cc2a2.html Tomcat manager 配置 https://blog.csdn.ne…

JavaFX技巧2:使用Canvas API进行清晰绘图

当我最初开始使用Canvas API时,我注意到渲染代码的结果有些模糊,甚至更糟,不一致。 有些线条模糊,有些线条清晰。 来自Swing,我花了一些时间才意识到这是由JavaFX的坐标系引起的,该坐标系允许双精度渲染。 …

在阳光下歌唱

在阳光下歌唱 ——代腾飞 2007年11月27日 于成都 在寒冬迷雾阴霾已久的早上 突然迎来了一轮金色的太阳 清新的晨风轻抚着我的脸庞 一缕缕暖暖的阳光洒子身上 让人倍感清新爽朗欢心舒畅 昔日的忧伤也不再让人惆怅 往日的苦难也顿时被人遗忘 骑着车儿在阳光下尽情歌唱 我歌唱秋…

[Apple开发者帐户帮助]五、管理标识符(4)注册一个应用程序组

您需要注册一个或多个组才能启用应用组。 所需角色:帐户持有人或管理员。 在“ 证书”,“标识符和配置文件”中,从左侧的弹出菜单中选择操作系统。 在“标识符”下,选择“应用程序组”,然后单击右上角的“添加”按钮&…