Apache Ignite - 在群集中安排

时间:2017-01-03 20:21:51

标签: apache datagrid cluster-computing ignite

我一周以来一直在思考这个问题,但我没有想到让我信服的事情。

我有一个在所有节点上运行带有Jersey的Jetty的小集群(它们都是相同的)。请求在节点上是平衡的,并且所有节点都是"无状态"。

用户数据在嵌入JVM的Apache Ignite上使用Jetty进行分区,因此可供任何节点访问。

到目前为止,所有对此数据执行的操作都是由REST请求触发并由请求偶然发现的节点管理的。但现在需求已经改变。一个例子如下:

在用户执行特定操作(提供虚拟商品)后,很少有其他随机用户收到有关兑换此商品的机会的通知。根据他们中的任何一个(在发布后的规定时间内),他们将拥有它。 问题在于:如果没有用户在给定时间内兑换商品,我想挑选几个新用户并通知他们。

这需要安排,我只能看到两个解决方案:

  • 在通知前几个用户的节点上安排事件。 (如果节点失败或重新加载,则不可靠)

  • 从所有节点池中存储分布式集合,其中存储了触发到期事件所需的数据。然后运行那些过期的。 (看起来这个集合增长时效率较低的解决方案)

    • 两者的混合物;事件存储在分布式集合中并且调度可能是好的。如果节点未失败,则运行并删除集合条目。集合的缓慢迭代将检查是否存在已过期且尚未删除的事件。 (看起来很难调试和预测的解决方案)

我也读过DelayedQueue实现,看起来不是一个有效的系统来管理大量的计划任务。

我将承认我遇到了困难,我需要就如何在群集基础上安排事件提出建议,以确保他们将被调用,以及他们将抵抗节点故障。

1 个答案:

答案 0 :(得分:1)

我认为您可以创建一个负责调度的集群单例(https://apacheignite.readme.io/docs/cluster-singletons)。这将在崩溃的情况下自动处理故障转移。如果存在任何状态(例如,有关已通知的用户的信息,上次安排作业的时间戳等),则可以将其保存在缓存中。