Java MQ以异步方式处理、聚合和发布数据
在讨论真正的问题之前,先了解一些背景: 我正在开发一个由几个不同模块组成的后端应用程序。目前,每个模块都是一个“按需”运行的命令行java应用程序(稍后将提供更多详细信息) 每个模块都是一个“步骤”,是一个更大流程的一部分,您可以将其视为一个数据流;第一步从外部源收集数据文件并将其推/加载到一些SQL数据库表中;然后,根据不同的条件和事件(计时、数据库中数据的存在、通过web服务/web界面完成的消息和详细说明),执行以下步骤,从(1个或多个)数据库表中获取数据,对其进行处理,并将其写在不同的表中。步骤在三个不同的服务器上运行,从三个不同的数据库读取数据,但只在一个数据库中写入数据。其目的是聚合数据、计算指标和统计数据 目前,使用cronjob定期执行每个模块(从第一个模块的几分钟/小时到链中最后一个模块的几天,这需要聚合更多数据,因此需要等待更长的时间才能使用)。 运行一个模块(目前是一个java控制台应用程序),它在给定的日期时间窗口中检查数据库中新的、未处理的信息,并完成其工作 问题是:它是有效的,但是。。我需要扩展和维护它,这种方法开始显示出它的局限性Java MQ以异步方式处理、聚合和发布数据,java,notifications,redis,message-queue,dataflow,Java,Notifications,Redis,Message Queue,Dataflow,在讨论真正的问题之前,先了解一些背景: 我正在开发一个由几个不同模块组成的后端应用程序。目前,每个模块都是一个“按需”运行的命令行java应用程序(稍后将提供更多详细信息) 每个模块都是一个“步骤”,是一个更大流程的一部分,您可以将其视为一个数据流;第一步从外部源收集数据文件并将其推/加载到一些SQL数据库表中;然后,根据不同的条件和事件(计时、数据库中数据的存在、通过web服务/web界面完成的消息和详细说明),执行以下步骤,从(1个或多个)数据库表中获取数据,对其进行处理,并将其写在不同的表
- 将其他“非数据”表添加到数据库中,每个模块在其中写入“嘿,我已经这样做了,它是可用的”。当cronjob启动另一个模块时,它读取表,决定他可以计算子集xxx,并执行该操作。等等
- 使用消息队列,如ZeroMQ(或apachecamel,如@mjn建议的),而不是DB表
- 使用键值存储,如Redis,而不是DB表
- 3) 有没有什么办法可以帮我彻底摆脱这些工作
- 4) 我是否应该将这个基于消息(事件?)的解决方案构建为一个集中式服务,在其中一个服务器上作为守护进程/服务运行它李>
- 5) 我是否应该放弃按需启动订阅服务器的想法,让每个模块作为守护进程/服务连续运行李>
- 6) 哪些是优点和缺点(可靠性、单点故障与资源使用和复杂性…)
队列任务描述部分听起来像是基于“”的系统所做的事情 A可以用常数表示
from("seda:b").delay(1000).to("mock:result");
或变量,例如消息头值
from("seda:a").delay().header("MyDelay").to("mock:result");
1> 我建议使用消息队列,根据您的需求选择队列,但对于大多数情况,我建议您选择基于协议JMS(活动mq)或AMQP(兔子mq)的队列,并在其上编写一个简单的包装器,或者使用spring->spring JMS或spring AMQP提供的包装器 2> 您可以编写队列使用者,以便它们通知您的系统新消息到达,例如,在rabbit中,您可以实现MessageListener接口
public class MyListener implements MessageListener {
@Override
public void onMessage(Message message) {
/* Handle the message */
}
}
3> 如果像中一样使用异步使用者,则可以摆脱所有轮询和cron作业
4> 取决于您的需求->如果有数百万事件/消息通过队列,则在集中服务上运行队列中间件