寻找可扩展的“at”实现

我正在寻找一个具有高可用性的可扩展的“at”替代品。它必须支持在运行时添加和删除作业。

一些背景:我有一个应用程序,我触发了数百万个事件,每个事件只发生一次。我不需要像cron这样的机制(每月的第一个星期日等),只需要日期,时间和上下文。

目前我正在使用Quartz调度程序,虽然它是一个非常好的项目,但由于它在下划线数据库上执行的基本锁定,因此很难处理我们向它抛出的事件数量,即使经过大量调整(分片,增加轮询间隔等)。此外,这对我们来说有点过分,因为基本上我们有数百万个一次性触发器,而作业数量相对较少。

我将不胜感激任何建议


答案 1

如果我遇到同样的情况,我会执行以下操作...

使用几个框上的队列复制设置来设置 JMS 队列集群(例如 RabbitMQ 或 ActiveMQ)。

在我漂亮的高可用性 JMS 队列中触发所有事件。

然后,我将编写一个代理应用程序,该应用程序根据需要弹出JMS队列的事件,我可以在多个盒子上运行多个代理,并将其与正确的JMS故障转移URL等相结合。

如果您的作业正在触发事件,您也可以使用相同类型的模型...

仅供参考,核心Java中更好的调度方式如下:

ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(sensibleThreadCount);
    threadPool.scheduleAtFixedRate(new Runnable() {

    @Override
    public void run() {
       //Pop events from event queue.
       //Do some stuff with them.
    }

    }, initialDelay, period, TimeUnit.X);

答案 2

也许只是使用JGroups共享树,任务按执行时间排序。节点将接受第一个任务和调度计时器,该计时器将在给定时间执行。在任务上,可以取消计时器。所以基本上你可以只使用JGroups和简单的java计时器/执行器。

我没有完整阅读,但这里有一些概念证明,甚至可能是解决方案


推荐