我们有一个要求,我们必须运行许多异步后台进程来访问DB,Kafka队列等。截至目前,我们正在使用Spring Batch和Tomcat(爆炸WAR)。但是,我们遇到了一些我无法使用Spring Batch解决的问题。我正在考虑使用其他框架,但无法找到解决我所有问题的任何框架。
很高兴知道是否存在解决以下问题的框架:
- 由于Spring Batch在一个Tomcat容器(1个java进程)内运行,因此任何作业/步骤中的任何小更新都将导致重新启动Tomcat服务器。这会导致所有正在运行的作业难以停止,从而导致数据不完整/过时。
醇>
我想要的是:捆绑所有罐子并将每个作业作为一个单独的过程运行。框架应该存储PID,并且应该能够按需管理(停止/强制终止)作业。这样,当我们想要更新JAR时,现有的流程不会受到阻碍(但是,我们应该能够从UI停止现有流程),也不会触及其他工作(运行与否)
我已经看过Tomcat中JAR的热更新,但是我是否怀疑是否在生产中使用这种机制。
子问题:OSGI是否会与Spring Batch集成?如果是这样,是否可以将每个作业作为一个单独的容器运行,其中嵌入了所有JAR?
- Spring批处理没有主从架构。
醇>
我想要什么:应该有一个主人,其中指定了工作列表。应该有从机(工作程序),它们在配置文件中指定为主机。主站中应该存在一个调度程序,当需要启动作业时,应该为从站分配一个作业(可能是负载平衡的,但不是必需的),并且从站应该更新DB。主设备应该能够从从设备发送和接收数据(启动/停止/终止任何作业,让我更新正在运行的作业等),以便它可以在UI上显示。
这样,如果我的负载很高,我应该可以只将机器添加到集群中并修改主配置文件,并且负载应该立即得到平衡。
- 弹簧批次在作业停止/失败的情况下没有内置警报机制。
醇>
我想要什么:我应该能够在出现故障时为工作设置警报。如果有必要,作业应该有一个超时,它应该能够通知用户(可能通过电子邮件)或者当作业超过指定的阈值时强制停止作业。
答案 0 :(得分:4)
也许vertx可以做到这一点。
由于Spring Batch在一个Tomcat容器(1个java进程)内运行,因此任何作业/步骤中的任何小更新都将导致重新启动Tomcat服务器。这会导致所有正在运行的作业难以停止,从而导致数据不完整/过时。
Vertx允许您构建微服务。每个vertx实例都能够与其他实例通信。如果你停止一个,其他人仍然可以工作(如果没有依赖,例如,如果你停止掌握,奴隶将失败)
Vert.x is not an application server.
There's no monolithic Vert.x instance into which you deploy applications.
You just run your apps wherever you want to.
Spring批处理没有主从架构
由于vertx 甚至驱动,您可以轻松创建主从架构。例如,在vertx实例中处理http请求,并根据请求的性质在几个其他实例之间分配它们。
弹簧批次在作业停止/失败的情况下没有内置警报机制。
在vertx中,您可以为每条消息设置超时并处理失败。
Sending with timeouts
When sending a message with a reply handler you can specify a timeout in the DeliveryOptions.
If a reply is not received within that time, the reply handler will be called with a failure.
The default timeout is 30 seconds.
Send Failures
Message sends can fail for other reasons, including:
There are no handlers available to send the message to
The recipient has explicitly failed the message using fail
In all cases the reply handler will be called with the specific failure.
编辑在java中还有其他框架可以做微服务。 Dropwizard就是其中之一,但我无法更多地谈论它。