java akka_用于大型事件处理的Akka Java

java akka

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

基于此,我们需要一种在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中,不是直接调用对象,而是构造一条消息,并通过参与者引用将其发送到该对象(称为参与者 )。 这种设计大大简化了
并发管理。

但是,简单性并不意味着可以在不更改代码的情况下将传统的基于锁的并发程序(线程/同步)转换为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

java akka

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

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

相关文章

xftp的简单使用

xftp的简单使用 1.下载并安装Xftp工具。打开Xftp工具,点击“新建”。 2.在“新建会话属性”中选择“名称”为主机命名,在“主机”栏输入主机IP,“协议”和“端口号”使用sftp和22,在“用户名”和“密码“栏输入账户密码。点…

与OutOfMemoryError相关的JVM参数

JVM提供了有用的参数来处理OutOfMemoryError 。 在本文中,我们要强调那些JVM参数。 在对OutOfMemoryError进行故障排除时,它可能对您很方便。 这些JVM参数是: -XX: HeapDumpOnOutOfMemoryError -XX:HeapDumpPath -XX…

This beta version of Typora is expired, please download and install a newer;解决方法

亲测可行的方法,方便永久 1.打开注册表 cmd(Win R)–>regedit 2.修改Typora权限 计算机\HKEY_CURRENT_USER\Software\Typora 右键Typora选择权限打开,然后选择拒绝 注意需要选择好组与用户名【最直接的就是所有用户与组均点…

IEEE在指定期刊下搜索相关论文

在左边Publication Title中直接输入目标期刊,搜索后结果显示指定期刊下文章

操作方法:Spring Boot和Thymeleaf与Maven

Spring Boot是一款出色的软件,可让您在几秒钟内引导Spring应用程序。 它确实有效。 尽可能少的配置即可上手。 而且仍然可以更改默认值。 让我们看看用Thymeleaf和Maven引导Spring MVC并在IntelliJ中使用它是多么容易。 Spring MVC Thymeleaf与Maven的基本设置 确…

Ubuntu安装VSCode

1. 一般方法: 首先是进入到vscode官网:https://code.visualstudio.com/Download ,选择.deb包下载 但是下载deb包时,速度很慢而且一直提示“网络连接已断开” 2. 解决办法: 将下载地址中 az764295.vo.msecnd.net 替换…

如何在Java中使用正则表达式?

正则表达式是用于文本搜索的非常重要的工具。 以下是用于执行正则表达式搜索并基于正则表达式捕获字符串的不同部分的代码段 public class RegexTest { public static void main(String[] args) { String name "01_My-File.pdf" ; match(name); match( "09_03_…

xxx is not in the sudoers file.This incident will be reported错误

一 问题解决 在执行sudo命令时会有如下提示: xx is not in the sudoers file. This incident will be reported. 原因分析:一般这种情况是创建了新用户,没有对应修改sudoers文件或者group文件。 解决方法: 方法1:…

Ubuntu压缩与解压文件

tar -xvf FileName.tar # 解包tar -cvf FileName.tar DirName # 将DirName文件打包 注意 -c create -x extract

java字节码_好的,每个接触Java字节码的人

java字节码Oracle诉Google一案认为,复制Java API的结构,序列和组织是侵犯版权的行为。 侵犯版权不仅是复制行为,而且还适用于拥有该作品副本的所有中间方。 那就是编写/编译任何JVM语言的人,以及在他们拥有的任何设备上都有JAR文…

使用WireMock进行更好的集成测试

无论您是遵循传统的测试金字塔还是采用诸如“ 测试蜂窝”这样的较新方法,都应该在开发过程中的某个时候开始编写集成测试。 您可以编写不同类型的集成测试。 从持久性测试开始,您可以检查组件之间的交互,也可以模拟调用外部服务。 本文将讨论…

Acwing刷题第一节

756 题目分析 &#xff1a; 要点如下&#xff1a; 1. 矩阵遍历&#xff1a;确定遍历方向 2. 确定遍历边界 #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N 110; int n,m; int res[N][N];int main() {…

Jetty,Java和OAuth入门

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 Jetty是一个小型&#xff0c;高度可扩展的基于Java的Web服务器和servlet引擎。 它支持HTTP / 2&#xff0c;WebSocket…

vscode 设置 sublime 的主题

vscode 怎么设置 sublime 的主题&#xff1f; VsCode中提供多种主题样式&#xff0c;供使用者选择。 由于习惯于Sublime默认主题&#xff0c;因此将VsCode主题更换为Sublime默认主题。 首先点击编辑器顶部导航菜单中的【文件】&#xff1b; 然后点击【首选项】下【颜色主题】…

VsCode与Sublime编辑器优缺点对比

一 VS code与Sublime共同点 文本功能强大&#xff0c;支持各种语言高亮支持编译&#xff0c;且可以在控制台看到输出可安装大量插件 二 VsCode优点 1. 插件管理成熟 插件很多&#xff0c;近vscode发展势头猛&#xff0c;安装插件方便简单&#xff0c;有插件的详细介绍 vscode新…

spring预加载与懒加载_通过Spring将继承树加载到List中

spring预加载与懒加载我注意到有趣的Spring功能。 我的一位同事使用它将Spring Bean的整个继承树加载到列表中。 在学习Spring文档时错过了这一点。 让我们来看看Spring bean的继承树&#xff1a; 下面的代码片段是通过构造函数注入将此豆树加载到列表中的&#xff1a; Comp…

VsCode连接远程服务器并修改文件代码

一 插件安装配置 1. 安装远程开发插件Remote Development&#xff0c;在商店中搜索Remote Development并安装。 2、选择SSH Targets 安装完成后&#xff0c;vscode左侧多出了一个菜单栏&#xff0c;我们点击配置按钮配置远程服务器的地址。选择SSH Targets。 二 远程服务器配…

Java和Round-Robin上的AtomicInteger

AtomicInteger属于Atomic Variables族。 主要好处是使用它不会阻塞而不是进行阻塞同步&#xff0c;因此避免了线程的挂起和重新调度。 AtomicInteger基于“比较和交换”机制&#xff0c;并且是原子变量的标量组的一部分。 我们的第一个用例是可以多次访问的网页上的功能。 pa…

VsCode打开终端的方法

方法1&#xff1a;打开终端的常规方法 打开VScode后&#xff0c;鼠标左键单击窗口顶部的【查看】&#xff08;如下图红圈标注&#xff09;&#xff0c; 在下拉列表中找到【终端】&#xff08;如下图红框标注&#xff09; 鼠标左键点击【终端】即可打开终端子窗口&#xff0c;如…