我一周以来一直在思考这个问题,但我没有想到让我信服的事情。
我有一个在所有节点上运行带有Jersey的Jetty的小集群(它们都是相同的)。请求在节点上是平衡的,并且所有节点都是"无状态"。
用户数据在嵌入JVM的Apache Ignite上使用Jetty进行分区,因此可供任何节点访问。
到目前为止,所有对此数据执行的操作都是由REST请求触发并由请求偶然发现的节点管理的。但现在需求已经改变。一个例子如下:
在用户执行特定操作(提供虚拟商品)后,很少有其他随机用户收到有关兑换此商品的机会的通知。根据他们中的任何一个(在发布后的规定时间内),他们将拥有它。 问题在于:如果没有用户在给定时间内兑换商品,我想挑选几个新用户并通知他们。
这需要安排,我只能看到两个解决方案:
在通知前几个用户的节点上安排事件。 (如果节点失败或重新加载,则不可靠)
从所有节点池中存储分布式集合,其中存储了触发到期事件所需的数据。然后运行那些过期的。 (看起来这个集合增长时效率较低的解决方案)
我也读过DelayedQueue实现,看起来不是一个有效的系统来管理大量的计划任务。
我将承认我遇到了困难,我需要就如何在群集基础上安排事件提出建议,以确保他们将被调用,以及他们将抵抗节点故障。
答案 0 :(得分:1)
我认为您可以创建一个负责调度的集群单例(https://apacheignite.readme.io/docs/cluster-singletons)。这将在崩溃的情况下自动处理故障转移。如果存在任何状态(例如,有关已通知的用户的信息,上次安排作业的时间戳等),则可以将其保存在缓存中。